ObjC:将id限制为某些类型

时间:2012-10-30 10:56:28

标签: objective-c types

在Objective-C中,是否可以将id限制为几种类型?我想编写一个具有id参数的方法,但此方法仅适用于某些ObjC类型:使用id可能会导致运行时错误。是否有任何LLVM约定或类似的东西?

3 个答案:

答案 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>的表达式。