嘿伙计们,我有一个定义了许多ObjC-2.0属性的协议,如下所示:
@protocol Repeatable <NSCoding>
@required
@property (nonatomic, retain) Date *startDate;
@property (nonatomic, retain) Date *endDate;
@end
我有另一个实现协议的类:
@interface AbstractRepeatable : NSObject <Repeatable>
最后,在AbstractRepeatable中,我正在实现一个由协议定义的方法:
- (BOOL)isEqualToRepeatable:(Repeatable *)r {
if (r.startDate != startDate) // Compiler error here
return NO;
return YES;
}
例如,为了比较,排除了比特和碎片,但是在编译时,我在上面提到的行上收到了熟悉的“成员'startDate'请求,而不是结构或联合”。 AbstractRepeatable显然包含了Repeatable头,否则协议将不可见,所以我不知道我缺少哪一部分。
答案 0 :(得分:7)
在isEqualToRepeatable:
方法中,您将Repeatable视为一个类,而不是一个协议。尝试使用以下内容。之后一切都应该正常工作。我测试了它。 (手指交叉,我不会看起来很愚蠢。)
- (BOOL)isEqualToRepeatable:(id<Repeatable>)r {
if (r.startDate != startDate) // Compiler error here
return NO;
return YES;
}
答案 1 :(得分:1)
这应该有效并按照您的期望行事。但它并不是因为编译器坏了。
很抱歉。
作为一种解决方法,您需要在协议中声明方法:
@protocol Repeatable <NSCoding>
@required
@property (nonatomic, retain) Date *startDate;
- (Date *) startDate;
- (void) setStartDate: (Date *) aDate;
@property (nonatomic, retain) Date *endDate;
- (Date *) endDate;
- (void) setEndDate: (Date *) aDate;
@end
如果需要,可以跳过@property。修复编译器后,上面仍然不会产生任何警告。
(是的,你仍然可以@synthesize方法。我相信@synthesize将在这种情况下工作。如果它没有 - 它可能没有 - 那么你需要重新声明类中的属性 - 可能在类扩展中 - 直到编译器被修复。如果第二个问题证明是这种情况,请通过http://bugreport.apple.com/提交错误
答案 2 :(得分:0)
@property ... startDate
仅声明两种方法-startDate
和-setStartDate:
。
你必须实际实现它们。在协议中,这不能用实例变量来完成。