在以下代码中
id<SwiftProtocol> anotherInstanceAsProtocol = [[SomeObjectiveCClassImplementingOBJCSwiftProtocol alloc] init];
[anotherInstanceAsProtocol isKindOfClass:[SomeObjectiveCClassImplementingOBJCSwiftProtocol class]];
我收到警告“选择器'isKindOfClass:'的未知实例方法”
如果我将最后一行修改为
[(id)anotherInstanceAsProtocol isKindOfClass:[SomeObjectiveCClassImplementingOBJCSwiftProtocol class]]
运行完美。
如果我分配给NSObject<SwiftProtocol>
而不是id<SwiftProtocol>
也可以,但是我认为两者都不是必需的。
为什么需要强制转换?
答案 0 :(得分:2)
问题在于您的SwiftProtocol
不继承自NSObject(Protocol),因此Obj-C编译器不知道有一个称为isKindOfClass:
的方法。
基本上,使用id
意味着您不需要在编译时进行任何类型检查。真正的解决方法应该是使协议扩展NSObjectProtocol
,并确保符合该协议的所有实例都是普通的Obj-C对象。
请注意,Objective-C的历史很复杂,并非所有的Objective-C对象都必须继承自NSObject
并具有isKindOfClass:
。