2017-06-08 60 views
0

我有一個方法,我試圖更新到64位支持我的應用程序。我有很多這些warnings正確更新一個32位方法到64位支持

問題出在下面的例子。我得到警告:

隱式轉換失去整數精度NSInteger的爲int

- (int) aMethod { 
    NSUserDefaults *u = [NSUserDefaults standardUserDefaults]; 
    return [u integerForKey:@"someKey"]; 
} 

如果我改變返回類型NSInteger我得到

實施相互矛盾的返回類型aMethod int vs NSInteger aka long

-(NSInteger) aMethod { 
    NSUserDefaults *u = [NSUserDefaults standardUserDefaults]; 
    return [u integerForKey:@"someKey"]; 
} 

我試圖鑄造返回類型

return (NSInteger)[u integerForKey:@"someKey"];

return (long)[u integerForKey:@"someKey"];

但我不能讓錯誤消失,除非我將它轉換爲(INT)

return (int)[u integerForKey:@"someKey"];

我已經閱讀了許多SO問題,但我似乎無法得到一個很好的答案。

什麼是更新此方法的正確方法?

+0

當您使用' - (NSInteger)aMethod {'時,您是否也更新.h文件中的簽名? (...或任何其他宣佈的地方。) –

+0

你說得對。我忘了更新我的.h文件* facepalm * –

回答

0

的方法:

- (int) aMethod ... 

返回int類型的值。該方法可能首先聲明,可能在頭文件(.h)文件中,然後在實現(.m)文件中定義。

聲明:

return [u integerForKey:@"someKey"]; 

返回調用integerForKey:,這是NSInteger類型的值的結果。

NSInteger是不是由(Objective-)C 語言定義的類型,而它是在旨在表示在平臺上的「自然的」整數大小框架定義的類型別名typedef) 。它是32位平臺上的int和64位上的long的別名。

因此,您的編譯器錯誤告訴您(現在)的64位值正在被截斷以適合32位結果。還有就是要解決這個問題沒有唯一正確的途徑,這取決於什麼用與@someKey關聯的值是:

  • 如果該值現在應該再64位改變aMethod返回類型;無論是在其單獨的聲明中,是否有它,還是在其實施中;到NSInteger。您還需要檢查無論哪種方法被調用返回一個NSInteger值是可以接受的,並且您可能需要對變量類型進行後續更改等。您還需要查看與該鍵關聯的值的位置組。
  • 如果與密鑰關聯的值可能會保持爲32位,則可以使用intForKey:而不是integerForKey,並按原樣保留返回類型。你也應該改變,其中鍵設置爲存儲一個int

HTH

修正

有(不再?)的便捷方法intForKey:NSUserDefaults。替代方案包括:integerForKey:和鑄造; objectForKey:獲得NSNumber參考,然後intValue;等等。