iOS类别符合具有属性的协议:如何实现

时间:2013-12-23 21:43:16

标签: ios objective-c properties protocols objective-c-category

我在类中创建了一个类别,该类别符合协议,该协议在其实现中需要一个属性。但是,因为我属于某个类别,所以我无法在该类别的实现中合成该属性。因此,我很难理解如何实现setter方法(当我保持协议的属性readonly它工作正常,因为我需要的只是一个访问器方法)。

这是我的协议:

@protocol SomeProtocol <NSObject>
@property (nonatomic) BOOL didDisplayRecommendation;
@end

我知道如果我这样做,我会得到一个无限循环:

- (void)setDidDisplayRecommendation:(BOOL)didDisplayRecommendation
{
    self.didDisplayRecommendation = didDisplayRecommendation;
}

但是当我尝试这个时,我得到一个编译器错误:

- (void)setDidDisplayRecommendation:(BOOL)didDisplayRecommendation
{
    _didDisplayRecommendation = didDisplayRecommendation;
}

请注意,didDisplayRecommendation是协议中的属性。解决这个问题的最佳方法是什么?提前谢谢!

3 个答案:

答案 0 :(得分:2)

不允许您通过类别向类添加实例变量,请参阅https://stackoverflow.com/a/13000930/171933

由于您需要一个变量来保存didDisplayRecommendation的值,因此您不希望使用某个类别(除非您想弄脏https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/uid/TP40001418-CH3g-SW5)。

我建议您重新考虑一下您的架构,看看您是否真的需要使用类别。子类甚至Mixins可能是更好的方法。

答案 1 :(得分:0)

在协议中添加属性时,需要@synthesize它们。

答案 2 :(得分:0)

我有一个宏,可以让你在类别中声明“属性”:

@implementation NSObject (AwesomeUtils)

JESynthesize(assign, NSInteger, index, setIndex);
JESynthesize(strong, NSString *, name, setName);
JESynthesize(copy, void(^)(void), completion, setCompletion);
JESynthesize(unsafe_unretained, id, unsafeObject, setUnsafeObject);
JESynthesize(weak, id<UITableViewDelegate>, delegate, setDelegate);
JESynthesize(strong, NSString *, readonlyID, changeReadonlyID);

// …
@end

我用引号说“属性”,因为即使没有@property声明也可以使用它们。该宏也可用于支持weak

您可以在此处检查实施(标题文件位于底部): http://nspicks.com/2013/12/15/cleaner-properties-implementation-in-categories/