我创建了一个名为EventListener
的协议:
@protocol EventListener
...
@end
我也有班级Processor
,如:
// Processor.m
@synthesize listeners = _listeners; //@property NSMutableArray* in Processor.h
- (id) init {
self = [super init];
self.listeners = [[NSMutableArray alloc] init]; //init with empty array
return self;
}
- (void) addListener:(id<EventListener>)listener {
[self.listeners addObject:listener];
}
我有另一个名为Plugin
的课程:
@interface Plugin : NSObject <EventListener> { ... }
...
@end
在其实施中,我执行:
// Plugin.m
[self.processor addListener:self];
并收到警告
不兼容的指针类型发送
类型的参数Plugin*
发送到Listener*
我做错了什么?
我来自java世界,并假设因为我的处理器实现了协议,它应该是Listener的类型,如:
interface Listener {
}
class Processor {
List<Listener> listeners = new ArrayList<Listener>();
void addListener(Listener listener) {
listeners.add(listener);
}
}
class Plugin implements Listener {
Processor processor = new Processor();
void method() {
processor.addListener(this);
}
}
答案 0 :(得分:2)
在Objective-C中,类和协议是完全不同的东西 - 与Java的类和接口不同 - 具有不同的语法。
如果你想接受任何类Listener
的类,或者是类Listener *
的后代,那么参数将是:
EventListener
如果您想接受任何实现协议id <EventListener>
的类,那么参数将是:
id
由于<EventListener>
表示&#34;任何班级类型&#34;并且Listener
补充说,传递的任何内容都应该实现该协议。
如果您只想接受EventListener
及其实现Listener <EventListener> *
的子类的那些,那么参数将是:
{{1}}
与Java形成鲜明对比,您可以直接使用接口类型而不指定任何类类型约束。
答案 1 :(得分:0)
宣布
时,您可以收到相同的警告@interface SomeClass <SomeProtocol> : NSObject
@end
而不是
@interface SomeClass : NSObject<SomeProtocol>
@end
第一种语法是正确的,但没有任何意义。