我想在目标C中做这样的事情:
@protocol MyProtocol <NSObject>
-(void)sampleMethod;
@end
@interface SampleClass1 : NSObject
@end
@interface SampleClass2
@property NSMutableArray* array;
@end
后来当我这样做时:
[array addObject:[SampleClass1 class]];
这应该发出警告,因为SampleClass1不符合协议MyProtocol。提前谢谢。
答案 0 :(得分:2)
对于类似的内容,您必须将类别添加到NSMutableArray
:
@interface NSMutableArray (AddConformingObject)
- (void)addConformingObject:(id<MyProtocol>)object;
@end
@implementation NSMutableArray (AddConformingObject)
- (void)addConformingObject:(id<MyProtocol>)object {
[self addObject:object];
}
@end
然后只使用addConformingObject:
代替addObject:
。
答案 1 :(得分:0)
NSObject
的每个子类都继承方法+ (BOOL)conformsToProtocol:(Protocol *)aProtocol
。因此,如果您希望简单地将对象添加到数组中,如果该类符合协议,您可以执行以下操作:
if ([[SampleClass class] conformsToProtocol:@protocol(aProtocol)]) {
[array addObject:[SampleClass class]];
}
值得注意的是,NSObject
提供了具有以下签名的+ (BOOL)conformsToProtocol:(Protocol *)aProtocol
和- (BOOL)conformsToProtocol:(Protocol *)aProtocol
答案 2 :(得分:0)
不是将array
作为属性公开并允许任何外部代码添加任何对象,而是向只接受正确对象的类添加“add”方法:
@protocol MyProtocol <NSObject>
-(void)sampleMethod;
@end
@interface SampleClass1 : NSObject
@end
@interface SampleClass2
- (void)addSpecialObject:(id<MyProtocol>)object;
@end
SampleClass2
的实现可以将对象添加到可变数组私有属性或ivar中。这样,没有客户端代码可以添加错误类型的对象。