2009-09-30 43 views
1

嗨,我有它定义了一些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; 
} 

星星点点已被排除例如-起见,但编译时,I R在上面提到的那条线上,提出熟悉的“请求会员”startDate“,而不是结构或联盟”。 AbstractRepeatable显然包含可重复标题,否则协议将不可见,所以我不知道我错过了哪个部分。

+1

这个答案可能会清晰一些东西给你:http://stackoverflow.com/questions/844678/how-to-handle-objective-c- protocols-that-c​​ontain-properties/844785#844785 – NSSec 2009-09-30 14:34:50

+0

我正在综合AbstractRepeatable中的属性,我无法弄清楚为什么prop没有被识别。 – 2009-09-30 15:29:07

回答

7

在您的isEqualToRepeatable:方法中,您正在处理可重复的类,而不是一个协议。尝试使用以下内容。之后一切都应该正常工作。我测试了它。 (手指交叉,我不会看起来愚蠢。)

- (BOOL)isEqualToRepeatable:(id<Repeatable>)r { 
    if (r.startDate != startDate) // Compiler error here 
     return NO; 
    return YES; 
} 
+0

男人,很好的电话!我很尴尬,我没有听清楚。 :D – 2009-09-30 16:53:27

+0

我很惊讶,完全解决了这个问题。在使用@property()协议的现有编译器中存在一个严重的错误。 – bbum 2009-09-30 19:56:59

0

@property ... startDate只声明了两种方法-startDate-setStartDate:

你必须实际执行它们。在协议中,这不能通过实例变量来完成。

+0

在协议中定义属性只是确保子类(或实现者,更具体地说)合成属性,并且可以将任何可重复方法传递给方法,并且具有代码来处理这些属性,假设它们存在于实际中对象,这是该协议的一个实现。 – 2009-09-30 15:34:35

+0

我应该澄清 - 定义协议中的属性不会综合变量。该协议的任何实现*必须*合成(或提供动态访问器方法)以确保该属性被“维护”。 – 2009-09-30 15:36:45

+0

这是一个好点。你试过用(r.startDate!= [self startDate])替换(r.startDate!= startDate)吗? – mouviciel 2009-09-30 15:42:08

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在这种情况下会起作用,如果它不 - 它可能不会 - 然后你需要重新声明属性如果第二个问题证明是这种情况,请通过http://bugreport.apple.com/

+1

我相信编译器正在合成getters/setters。查看所选答案以获得很好的解释。 – 2009-09-30 16:52:29

+0

编译器正在合成getter/setter。这不是问题。问题在于,编译器在类声明中没有看到@property(),表示方法需要正确。在某些情况下,它会导致不正确的代码。 – bbum 2009-09-30 19:56:13