好吧,我有一種感覺,你們能夠快速指出爲什麼我對此感到困惑,但我有一個問題,爲什麼以下不會導致編譯器錯誤或警告:Objective-C類型推斷
NSString * intValue = [ NSString stringWithFormat:@"int = %i", [ [ self.selectedObject valueForKey:name ] integerValue ] ];
selectedObject
是NSObject
,和name
恰好是int
類型的@property
的名稱。
什麼困擾我的是爲什麼編譯器是完全願意承擔的[ self.selectedObject valueForKey:name ]
返回的結果是NSNumber *
型(不帶類型轉換的話),以便與以integerValue
調用鏈的消息。顯然,KVC將非對象「數字」類型封裝到NSNumber
中,但編譯器無法知道-valueForKey:
在此特定情況下將返回NSNumber *
。
爲什麼不會導致編譯器警告沿着「id
」行可能不會響應「-integerValue
」?
謝謝!我有一種感覺,它與'id'是Objective-C中的特權類型有關。 :)我的傾向是總是在任何可能的時候都緊緊打字,所以我想我從未遇到過這種看似奇怪的行爲。猜猜這使得'id'既強大又危險。我想知道在處理'id'的時候給類似的編譯器提供一些上下文是否更好,或者如果你對'id'將會變成什麼會產生積極的影響(如我的例子中的情況那樣) 。 – LucasTizma 2010-01-16 08:36:42
大拇指的規則是:「儘可能靜態輸入,需要時動態輸入。」(您可以通過谷歌獲得更多信息。)在這種情況下,我不會強制轉換,它只會使表達式難以閱讀。有時候你必須註釋以幫助編譯器選擇正確的方法 - 請參閱http://stackoverflow.com/questions/1113270。 – zoul 2010-01-16 08:52:10
感謝您的鏈接。我遇到了一些令人討厭的小錯誤,這是由於方法命名導致與現有SDK方法名稱「衝突」的結果。認爲編譯器對我很瘋狂。 :)是的,我完全支持「儘可能靜態打字,需要時動態打字」的理念。現在,如果只有Objective-C會添加對類型化集合的支持......看起來往往不是,我知道我的集合將要存儲什麼。 – LucasTizma 2010-01-16 09:08:39