在#class;'上实施协议一致性对象

时间:2014-08-06 23:01:49

标签: ios objective-c

我想在目标C中做这样的事情:

@protocol MyProtocol <NSObject>
-(void)sampleMethod;
@end

@interface SampleClass1 : NSObject
@end

@interface SampleClass2
@property NSMutableArray* array;
@end

后来当我这样做时:

[array addObject:[SampleClass1 class]];

这应该发出警告,因为SampleClass1不符合协议MyProtocol。提前谢谢。

3 个答案:

答案 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中。这样,没有客户端代码可以添加错误类型的对象。