访问协议的属性值?

时间:2009-09-30 14:26:34

标签: iphone objective-c xcode macos properties

嘿伙计们,我有一个定义了许多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头,否则协议将不可见,所以我不知道我缺少哪一部分。

3 个答案:

答案 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:

你必须实际实现它们。在协议中,这不能用实例变量来完成。