2012-11-06 38 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你不那麼修改的對象與下一條語句(如果它以你想象的方式工作),但相反,你會用另一個指針代替一個指針,所以第一行是無用的。