在Objective-C中,是否可以将id
限制为几种类型?我想编写一个具有id
参数的方法,但此方法仅适用于某些ObjC类型:使用id
可能会导致运行时错误。是否有任何LLVM约定或类似的东西?
答案 0 :(得分:1)
id
是一个通用的Objective-C对象指针,即它意味着任何对象。
限制类型的唯一方法是使用协议:
id <myProtocol>
因此,通过这种方式,您可以指向采用myProtocol
协议的任何对象。
答案 1 :(得分:1)
只要您处理对象,就可以要求它上课:
id anId;
if ([anId isKindOfClass:[NSNumber class]]) {
...
}
答案 2 :(得分:1)
“限制”id
不是Objective-C所具有的。无论如何,如果你传递的类型与方法声明中指定的类型不匹配的对象,你只会得到警告而不是编译器错误(除非你使用-Werror
编译),所以编译器可以真的阻止你这样做。
是的,这很容易出现运行时错误,但这就是Objective-C的工作原理。您应做的一件事是记录接受哪些类型。
您可以做的一件事是在运行时检查类型,使用isKindOfClass:
或isMemeberOfClass:
NSObject
方法}。此外,如果对象应该响应一组公共消息,则可以将它们包装到协议中并要求类型为id <MyProtocol>
的表达式。