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