在设置以下协议后,我注意到当我尝试从对象访问属性时,我收到警告:
// PROTOCOL
@protocol PetProtocol <NSObject>
- (void)printType;
@end
// CLASS
#import "PetProtocol.h"
@interface Animal : NSObject <PetProtocol> {
NSString *type;
}
@property (nonatomic, copy) NSString *type;
@end
以下内容来自我用于测试的ViewController / viewDidLoad。
// WARNING: setType not found in protocol
id <PetProtocol> pet_001 = [[Animal alloc] init];
[pet_001 setType:@"DOG"];
[pet_001 printType];
我想我可以看到为什么我收到此警告,因为“id”和“PetProtocol”都没有定义“type”属性。我有两个解决方案,但我只是想检查我是否正确。我倾向于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];
非常感谢
加里。
答案 0 :(得分:2)
你需要添加getter&amp;也是协议的设定者(不仅是班级):
// PROTOCOL
@protocol PetProtocol <NSObject>
- (void)printType;
- (void)setType:(NSString*)val;
- (NSString*)type;
@end