Objective-C的类型推断
-
21-09-2019 - |
题
好了,我有一种感觉,你guys'll能够迅速指出为什么我很困惑,但我有一个问题,为什么以下不会导致一个编译器错误或警告:
NSString * intValue = [ NSString stringWithFormat:@"int = %i", [ [ self.selectedObject valueForKey:name ] integerValue ] ];
selectedObject
是NSObject
,和name
恰好是类型@property
的int
的名称。
什么困扰我是为什么编译器是完全愿意承担[ 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"];
但通常你输入字符串“紧密”为NSString
s,因为你得到编译时静态类型检查的方便,只能求助于动态类型,其中静态人会从中作梗,想在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'
不隶属于 StackOverflow