这可能会给我一大堆downvotes,但是啊。请记住,我来自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个NSNumber做到这一点?如果那是不可能的,我必须使用NSDecimalNumber,我只是将所有内容转换为NSDecimalNumber并做这样的减法吗?唯一的事情是我只需要整数,因为我代表秒,不需要进入小数位和所有这些。
答案 0 :(得分:4)
不要使用NSNumber对象。
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;
答案 1 :(得分:3)
你可能还没有处理过面向对象的语言。并且很容易在NSInteger
(这是一个“标量”值)和NSNumber
(它是一个对象)之间混淆。
NSNumber
是数值的“容器”,但不能在算术中使用,就像它是一个数字一样。相反,您必须访问其中包含的值。
另请注意,说NSNumber *timeLeft = [NSNumber numberWithInt:0];
不会将数值初始化为零,而是在timeLeft
中存储指向“包装”值0的不可变NSNumber对象的指针。然后不要修改具有下一个语句的那个对象(如果它按你想象的方式工作),而是你将一个指针替换为另一个,所以第一行是没用的。