检查对象是否符合Objective-C中的两个单独协议

Jas*_*ien 13 cocoa cocoa-touch protocols objective-c compile-time

在Objective-C中,当您声明一个实例变量时,您可以检查它是否符合编译时分配的协议,如下所示:

id <MyProtocol> variable;
Run Code Online (Sandbox Code Playgroud)

是否有可能在编译时检查分配给变量的对象是否符合两个单独的协议?如:

id <MyProtocol, MyOtherProtocol> variable;
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用conformsToProtocol:and respondsToSelectoral等进行运行时检查(我在实际使用对象之前做的是为了增加安全性),我可以编写自己的setter方法进行检查,但我想在编译时知道.

Dav*_*ong 54

是的,这种语法是正确的.

检查对象是否符合协议的正确方法是:

if ([myObj conformsToProtocol:@protocol(MyProtocol)]) {
  //conformance!
}
Run Code Online (Sandbox Code Playgroud)

请注意,这既可以作为实例方法,也可以作为类方法.

如果由于某些奇怪的原因你无法使用conformsToProtocol:,你可以下拉到运行时级别:

#import <objc/runtime.h>

Protocol * p = objc_getProtocol("MyProtocol");
if (class_conformsToProtocol([myObj class], p)) {
  //conformance!
}
Run Code Online (Sandbox Code Playgroud)


Fel*_*ano 13

我认为最好是使用自己的代码:

id <MyProtocol, MyOtherProtocol> variable;
Run Code Online (Sandbox Code Playgroud)

在调用方法之前,检查变量是否响应您要调用的内容:

if ([variable respondsToSelector:@selector(aMethod:)]) {
    [variable aMethod:nil];
}
Run Code Online (Sandbox Code Playgroud)

由于Objective-C是一种动态语言,因此仅声明变量协议无法确保它符合协议.它会在您构建时主要生成警告.