我在xcode 7.3.1中有一个Objective-C项目。
项目代码消耗了一个第三方库,该库具有三个不同的对象A
,B
和C
。这些对象没有共同的父(Nsobject除外(,也没有实现共同的相关接口或协议。所有三个对象都实现以下方法:
- (id)dataForKey:(NSString *)key;
- (void)setData:(id)value forKey:(NSString *)key;
- (void)removeDataForKey:(NSString *)key;
我的代码在这三个对象上消耗这些方法,并且对它们进行相同的确切操作,例如
BOOL found = NO;
if ([a dataForKey:key] != nil) {
found = YES;
}
[a removeDataForKey:key];
if ([b dataForKey:key] != nil) {
found = YES;
}
[b removeDataForKey:key];
if ([c dataForKey:key] != nil) {
found = YES;
}
[c removeDataForKey:key];
return found;
我想将代码推广到
之类的东西- (BOOL)removeFromObject:(id)object {
BOOL found = NO;
if ([object dataForKey:key] != nil) {
found = YES;
}
[object removeDataForKey:key];
return found;
}
return [self removeFromObject:a] || [self removeFromObject:b] || [self removeFromObject:c];
如何将三个对象传递到removeFromObject
方法中,同时将代码保留为类型安全且尽可能强烈键入(因此,我不喜欢将通用对象传递给removeFromObject
方法的解决方案,而不是施放传递的通用通用物对象是三个对象之一(?
您为此使用协议。
@protocol MyProtocol <NSObject>
- (id)dataForKey:(NSString *)key;
- (void)setData:(id)value forKey:(NSString *)key;
- (void)removeDataForKey:(NSString *)key;
@end
因此,您的方法定义变为。
- (BOOL)removeFromObject:(id<MyProtocol>)object;