NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue];
var將爲2. 那麼,爲什麼?我明白,它對動態打字很關鍵,但底線是什麼?指定NSNumber爲NSString
NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue];
var將爲2. 那麼,爲什麼?我明白,它對動態打字很關鍵,但底線是什麼?指定NSNumber爲NSString
此代碼示例中沒有正在執行的操作:[string intValue]
是由NSNumber
提供的常規ObjectiveC方法,用於檢索以整數形式存儲在內部的值。您將對象指定給NSString
指針的事實不會改變任何內容:內部對象仍爲NSNumber
。你不會因爲Objective C是一種動態類型語言而崩潰。它可以讓你指定錯誤類型的對象,但如果你試試你string
對象上調用的NSString
方法,你會得到一個崩潰:
NSString *string = [NSNumber numberWithInt:2];
int var = [string intValue]; // OK
BOOL isTwo = [string isEqualToString:@"2"]; // Crash
我認爲OP認爲是因爲他把他的'NSNumber'對象賦給了一個'NSString *'變量,在那裏有一個字符串。 – 2013-05-14 18:26:35
是的,主要問題是爲什麼代碼有效? NSNumber被分配給NSString,然後intValue將該字符串轉換爲int。 – alex 2013-05-14 18:29:04
@alex NSNumber對象被分配給恰好是'NSString'指針的指針變量,但分配的對象仍然是'NSNumber'。沒有轉換完成。當你調用'intValue'時,它在'NSNumber'對象上被調用。不涉及任何類型的字符串。 – rmaddy 2013-05-14 18:40:54
到[string intValue]
的調用是一個真正的message expression。這是可行的,因爲string
確實指向一個NSNumber
對象,並且它響應intValue
消息。如果您嘗試發送特定於NSString類的消息(如rangeOfString
),則會顯示「無法識別選擇器」錯誤。
如果您在調試器中運行此操作並在其中放置斷點,則會看到運行時知道string
的類型實際上是NSNumber
。
沒有類型化它只是存儲參考NSNumber
然後再轉換回來。你甚至不需要NSString
這將與id
id this = [NSNumber numberWithInt:22];
int val = [this intValue];
NSLog(@"%d",val);
我沒有看到任何鑄件。你到底在問什麼? – 2013-05-14 18:25:38
有一個類型鑄造。但它是隱含的。從ID到NSString *。但是,當然,他想說些不同的話。 – 2013-05-14 18:39:12
@AminNegm-Awad,這不是鑄造,這是動態打字。 – vikingosegundo 2013-05-14 18:39:47