2010-11-09 69 views
1

设置以下协议后,我注意到,我得到一个警告,当我尝试访问属性从对象:协议属性警告?

// PROTOCOL 
@protocol PetProtocol <NSObject> 
- (void)printType; 
@end 

// CLASS 
#import "PetProtocol.h" 

@interface Animal : NSObject <PetProtocol> { 
    NSString *type; 
} 
@property (nonatomic, copy) NSString *type; 
@end 

下面是一个视图控制器/ viewDidLoad中,我正在使用的测试。

// WARNING: setType not found in protocol 
id <PetProtocol> pet_001 = [[Animal alloc] init]; 
[pet_001 setType:@"DOG"]; 
[pet_001 printType]; 

我想我能看到为什么我收到这样的警告既不“ID”,也不是“PetProtocol”确定“类型”属性。我有两个解决方案,但我只是想检查我是否正确。我倾向于001使用id,然后在访问该方法之前进行投射似乎是更好的选择,任何人都会关心评论吗?

// 001 
id <PetProtocol> pet_002 = [[Animal alloc] init]; 
[(Animal *)pet_002 setType:@"DOG"]; 
[pet_002 printType]; 

// 002 
Animal <PetProtocol> *pet_003 = [[Animal alloc] init]; 
[pet_003 setType:@"CAT"]; 
[pet_003 printType]; 

编辑:

我刚才一直在看这个,它似乎没有ID后面添加协议更好地工作(即,没有警告)?

// 003 
id pet_002 = [[Animal alloc] init]; 
[pet_002 setType:@"HAMSTER"]; 
[pet_002 printType]; 

大加赞赏

加里。

回答

2

你需要吸气&二传手添加到协议还(不仅是类):

// PROTOCOL 
@protocol PetProtocol <NSObject> 
- (void)printType; 
- (void)setType:(NSString*)val; 
- (NSString*)type; 
@end 
+0

你只能向前有声明它们,然后仍然使用@property制定者,或者你需要实现他们呢? – fuzzygoat 2010-11-09 18:45:58

+0

您必须拥有通过@synthesize创建的getter和setter,或者您需要自己实现它们。 – Brad 2010-11-09 18:49:13

+0

使用@property工作正常,我唯一担心的是它将协议绑定到Animal类。在这种情况下,它的解决方案,但我猜在更一般的情况下,你可能会更好的铸造? – fuzzygoat 2010-11-09 18:57:18