Define @property in Protocol

5

我有许多UIViewController的子类,并且我希望它们共享名为session的属性,该属性处理“已登录”状态。

我知道我可以使用父类,但这很明确,所以我想知道是否可以通过共享协议来“强制执行”session属性。

我从未见过在协议中定义显式属性(显然可以定义setter和getter),因此在协议中定义属性是一种值得推荐的模式吗?

4个回答

11
在协议或分类的声明中也可以出现@property。这在官方苹果文档中有说明,所以没有问题。

4

是的,使用协议可以添加属性:

@protocol MyProtocol <NSObject>

@property (nonatomic, retain) NSFoobar *baz;

@end

在每个采用此协议的类中都需要使用@synthesize baz;(或者您可以使用@optional关键字将声明属性标记为可选项)。


3

如果每个符合您的协议的类都有相应的@synthesize或提供getter和setter,您可以在协议中拥有属性。


但是对于一个类别来说,通常不能向类中添加实例变量。协议也不行,但它意味着该类将符合该属性。 - Besi
为什么不使用协议呢?如果使用分类,我必须为每个类编写一个分类,而使用协议,我只需要@synthesize已声明的属性即可。 - mAu
@mAu:这是一个很好的问题。我重写了我的答案,提到了如何使用协议来实现这个目标。 - jweyrich

2
在.h文件中:
 @property(nonatomic,strong)UILabel *mylabel;

在 .m 文件中:
 @synthesize mylabel = _mylabel;

编译器将为mylabel创建getter和setter。
Ex -> 

-(void)setMylabe:(UILabel *) mylabel { //setter


}

-(UIlabel*)mylabel { // getter


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接