在Objective-C的ObjC参数,有可能通过一个类作为参数的方法:声明,这是一个类符合的协议
- (void) methodThatTakesClass:(Class)theClass;
而且它能够传递一个实例,它是符合协议作为参数:
- (void) myConformInstance:(id <MyProtocol>)theObject;
是否可以使用组合功能?采用符合特定协议的类的方法。
在Objective-C的ObjC参数,有可能通过一个类作为参数的方法:声明,这是一个类符合的协议
- (void) methodThatTakesClass:(Class)theClass;
而且它能够传递一个实例,它是符合协议作为参数:
- (void) myConformInstance:(id <MyProtocol>)theObject;
是否可以使用组合功能?采用符合特定协议的类的方法。
是的。以下是将记录NSObject类的有效程序。如果你试图通过不符合NSObject的,如Object
类的类
#import <Foundation/Foundation.h>
void f(Class <NSObject> c) {
NSLog(@"%@",c);
}
int main() {
f([NSObject class]);
}
这将导致一个编译器错误。您也可以将其用于方法。
- (void)printClass:(Class <NSObject>)c;
也有效:
@interface Something: Object {
}
- (void) foo:(int(*)(void))bar;
@end
@implementation Something
- (void) foo:(int(*)(void))bar {
return (*bar)();
}
@end
int someFunc(void) {
return 9;
}
int main (int argc, char **argv) {
Something *object = [[Something alloc] init];
printf("%i\n", [object foo:&someFunc]);
[object release];
return 0;
}
这似乎是一个完全不同的问题的答案。 –
从[协议](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html) :“协议不能用于输入类对象,只有实例可以被静态类型化为一个协议,就像只有实例可以静态类型到一个类一样(但是,在运行时,类和实例都会响应conformsToProtocol:消息。)“ – albertamg
@albertamg好找。但是,至少有一些编译器会通过它。该规则可能是因为您无法更改代表该类的对象以符合协议。 – ughoavgfhw