2010-11-09 113 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