协议属性警告?

时间:2010-11-09 18:22:27

标签: iphone objective-c cocoa-touch

在设置以下协议后,我注意到当我尝试从对象访问属性时,我收到警告:

// 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];

非常感谢

加里。

1 个答案:

答案 0 :(得分:2)

你需要添加getter&amp;也是协议的设定者(不仅是班级):

// PROTOCOL
@protocol PetProtocol <NSObject>
- (void)printType;
- (void)setType:(NSString*)val;
- (NSString*)type;
@end
相关问题