声明一个ObjC参数,该参数是符合协议的Class

Mat*_*art 22 syntax protocols class objective-c

在Objective-C中,可以将类作为参数传递给方法:

- (void) methodThatTakesClass:(Class)theClass;
Run Code Online (Sandbox Code Playgroud)

并且可以将符合协议的实例作为参数传递:

- (void) myConformInstance:(id <MyProtocol>)theObject;
Run Code Online (Sandbox Code Playgroud)

是否可以使用组合功能?采用符合特定协议的类的方法.

ugh*_*fhw 14

是.以下是一个有效的程序,它将记录NSObject类.

#import <Foundation/Foundation.h>
void f(Class <NSObject> c) {
    NSLog(@"%@",c);
}
int main() {
    f([NSObject class]);
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试传递不符合NSObject的Object类(例如类),则会导致编译器错误.您也可以将它用于方法.

- (void)printClass:(Class <NSObject>)c;
Run Code Online (Sandbox Code Playgroud)

  • 从[Protocols](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html):"协议不能用于键入类对象.只有实例可以静态类型化为协议,就像只有实例可以静态类型化为类一样.(但是,在运行时,类和实例都会响应conformsToProtocol:消息.)" (2认同)