3

У меня есть категория в классе I, и эта категория соответствует протоколу, который требует свойства в его реализации. Однако, поскольку я в категории, я не могу синтезировать свойство в реализации категории. Из-за этого я не понимаю, как реализовать метод setter (когда я сохраняю свойство протокола readonly, он отлично работает, поскольку все, что мне нужно, это метод доступа).Категория iOS соответствует протоколу со свойствами: как реализовать

Это мой протокол:

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

Я знаю, что если я сделаю это, я получаю бесконечный цикл:

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

Но когда я пытаюсь это я получаю ошибку компиляции:

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

Обратите внимание, что didDisplayRecommendation является свойством в протоколе. Каков наилучший способ обойти это? Заранее спасибо!

+0

возможно дубликат [Objective-C Категория и новые Ивар] (http://stackoverflow.com/questions/10502539/ object-c-category-and-new-ivar) –

+0

Не дублируется, не затрагивает вопрос о соответствии протоколам – Mason

+0

Вам разрешено добавлять «специальные» свойства в категории с (at) свойством (неатомным, сохранить) MyClass * anObject - но в файле реализации все, что вы можете сделать, это (at) dynamic anObject, вы можете использовать функцию ассоциативных ссылок для маскировки других объектов вместо этого свойства. Он работает, и это не обходное решение, вам разрешено делать это в коммерческих приложениях, а также пропускает проверки протоколов. – unmircea

ответ

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 могут быть лучшим способом.

+0

Вы можете добавить «специальные» свойства в категории с (at) свойством (неатомным, сохранить) MyClass * anObject - но в файле реализации все, что вы можете сделать, это (at) dynamic anObject, вы можете затем использовать ассоциативную ссылку cfunction чтобы маскировать другие объекты вместо этого имущества. Он работает, и это не обходное решение, вам разрешено делать это в коммерческих приложениях, а также пропускает проверки протоколов. – unmircea

+0

@unmircea Да, это определенно ** технически возможно **. Однако, я думаю, у вас должна быть очень веская причина прибегать к ассоциативным ссылкам. –

0

При добавлении свойств в протокол вам необходимо @synthesize.

+4

Это не работает в категории Objective-C * *. –

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/

Смежные вопросы