1

这可能会给我很多反对票,但是啊。请记住,我来自 AS3 背景。

没错,我正在编写代码,显示自从种植/施工开始以来已经有多久了。我有我的 timeToCompletion 值和我的 timeSincePlanting 值,就像这样..

 //get seconds since planting/construction start
    NSDate *now = [NSDate date];
    NSTimeInterval secondsSincePlantingInterval = [now timeIntervalSinceDate:plantingDate];

    //convert to Number
    NSNumber *secondsSincePlanting = [NSNumber numberWithDouble:secondsSincePlantingInterval];

    //get template object
    NSDictionary *templateObject = [self getTemplate:kingdomObject];

    //get how long I should take (in seconds)
    NSNumber *timeToCompletion = [templateObject objectForKey:@"constructionTime"];

在我尝试这样做之前,一切都在顺利进行......

 NSNumber *timeLeft = [NSNumber numberWithInt:0];

 timeLeft = timeToCompletion - secondsSincePlanting;

哪个来自 AS3 是我的本能,但现在我意识到这可能只是试图从指针中减去一个指针?

所以第一个问题是,我怎样才能用 2 个 NSNumbers 做到这一点?如果这是不可能的并且我必须使用 NSDecimalNumber,我是否只需将所有内容都转换为 NSDecimalNumber 并像那样做减法?唯一的问题是我只需要整数,因为我代表秒,不需要进入小数位等等。

4

2 回答 2

4

Don't use the NSNumber objects.

NSDate *now = [NSDate date];
NSTimeInterval secondsSincePlantingInterval = [now timeIntervalSinceDate:plantingDate];

//get template object
NSDictionary *templateObject = [self getTemplate:kingdomObject];

//get how long I should take (in seconds)
NSNumber *timeToCompletion = [templateObject objectForKey:@"constructionTime"];
NSTimeInterval completionInterval = [timeToCompletion doubleValue];

NSTimeInterval timeLeft = completionInterval - secondsSincePlantingInterval;
于 2012-11-06T19:35:57.290 回答
3

您可能没有过多地处理面向对象的语言。并且很容易混淆NSInteger(这是一个“标量”值)和NSNumber(这是一个对象)。

AnNSNumber是数值的“容器”,但不能像数字一样在算术中使用。相反,您必须访问其中包含的值。

另请注意,sayingNSNumber *timeLeft = [NSNumber numberWithInt:0];不会将数值初始化为零,而是存储在timeLeft指向“包装”值 0 的不可变 NSNumber 对象的指针中。然后,您无需使用下一条语句修改该对象(如果它按照您的方式工作)想),但是你会用另一个指针替换一个指针,所以第一行是没用的。

于 2012-11-06T19:37:28.633 回答