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];
大加讚賞
加里。
你只能向前有聲明它們,然後仍然使用@property制定者,或者你需要實現他們呢? – fuzzygoat 2010-11-09 18:45:58
您必須擁有通過@synthesize創建的getter和setter,或者您需要自己實現它們。 – Brad 2010-11-09 18:49:13
使用@property工作正常,我唯一擔心的是它將協議綁定到Animal類。在這種情況下,它的解決方案,但我猜在更一般的情況下,你可能會更好的鑄造? – fuzzygoat 2010-11-09 18:57:18