2012-11-06 129 views
1

这可能会给我一大堆downvotes,但是啊。我记得我来自AS3背景。从Obj-c中减去一个数字

就这样,我正在编码一个显示自从开始播种或开始播种以来已经播放了多长时间的画面。我有我的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"]; 

而且一切都将swimingly直到我试图做到这一点...

NSNumber *timeLeft = [NSNumber numberWithInt:0]; 

timeLeft = timeToCompletion - secondsSincePlanting; 

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

所以第一个问题是,我怎么能用2个NSNumbers做到这一点?如果这是不可能的,我不得不使用NSDecimalNumber,我只是将一切都转换为NSDecimalNumber,并做这样的减法?唯一的事情是我只需要整数,因为我代表秒,不需要进入小数位等等。

回答

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; 
3

您可能还没有太多处理面向对象的语言。在NSInteger(这是一个“标量”值)和NSNumber(这是一个对象)之间很容易混淆。

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

还要注意的是说NSNumber *timeLeft = [NSNumber numberWithInt:0];没有一个数值不能初始化为零,而是在timeLeft存储指向一个不变的NSNumber对象是“包装”的值为0你不那么修改的对象与下一条语句(如果它以你想象的方式工作),但相反,你会用另一个指针代替一个指针,所以第一行是无用的。