必须强制转换为id才能调用isKindOfClass

时间:2019-05-18 11:37:09

标签: objective-c

在以下代码中

id<SwiftProtocol> anotherInstanceAsProtocol = [[SomeObjectiveCClassImplementingOBJCSwiftProtocol alloc] init];
[anotherInstanceAsProtocol isKindOfClass:[SomeObjectiveCClassImplementingOBJCSwiftProtocol class]];

我收到警告“选择器'isKindOfClass:'的未知实例方法”

如果我将最后一行修改为

[(id)anotherInstanceAsProtocol isKindOfClass:[SomeObjectiveCClassImplementingOBJCSwiftProtocol class]]

运行完美。

如果我分配给NSObject<SwiftProtocol>而不是id<SwiftProtocol>也可以,但是我认为两者都不是必需的。

为什么需要强制转换?

1 个答案:

答案 0 :(得分:2)

问题在于您的SwiftProtocol不继承自NSObject(Protocol),因此Obj-C编译器不知道有一个称为isKindOfClass:的方法。

基本上,使用id意味着您不需要在编译时进行任何类型检查。真正的解决方法应该是使协议扩展NSObjectProtocol,并确保符合该协议的所有实例都是普通的Obj-C对象。

请注意,Objective-C的历史很复杂,并非所有的Objective-C对象都必须继承自NSObject并具有isKindOfClass: