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