好了,我有一种感觉,你guys'll能够迅速指出为什么我很困惑,但我有一个问题,为什么以下不会导致一个编译器错误或警告:

NSString * intValue = [ NSString stringWithFormat:@"int = %i", [ [ self.selectedObject valueForKey:name ] integerValue ] ];

selectedObjectNSObject,和name恰好是类型@propertyint的名称。

什么困扰我是为什么编译器是完全愿意承担[ self.selectedObject valueForKey:name ]的返回结果的类型是NSNumber *的(没有它类型转换),以便通过调用integerValue到链中的消息。

显然,KVC包装了非对象“数字”类型分为NSNumber,但有没有办法让编译器知道-valueForKey:将在这种特殊情况下返回NSNumber *

为什么没有这一结果在沿行编译器警告“id可能不为‘-integerValue’响应”?

有帮助吗?

解决方案

我希望我猜中了:这是因为id是“特殊”。在id类型的对象可以发送你想要的任何消息,也没有编译器,一切都做检查将在运行时进行检查。或者,换句话说,该id类型是目标C的“动态类型”的部分,而所有其他类型(如NSObject)是“静态类型”的部分。

此方式,您可以选择您要使用静态类型,并且要使用动态类型在哪里。这是完全合法的,做这样的事情:

id str1 = @"Hello";
id str2 = [str1 stringByAppendingString:@", world"];

但通常你输入字符串“紧密”为NSStrings,因为你得到编译时静态类型检查的方便,只能求助于动态类型,其中静态人会从中作梗,想在valueForKey情况。

其他提示

时间已过,我们有更好的类型推断现在多亏了__auto_type 可用,因为Xcode中8所以,现在你可以做

#define let __auto_type const
#define var __auto_type

let a = @[@"pew pew"];
var b = 2;
b = a; //compiler warning "Incompatible pointer to integer conversion assigning to 'int' from 'NSArray *__strong const'"

在事实上,我喜欢这个以至于我提出这个为方便起见一个吊舱。

pod 'SwiftyObjC'
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top