Как определить категорию, которая добавляет методы к классам, которые реализуют определенный протокол?
Я хочу добавить некоторые методы к подклассам NSManagedObject, которые реализуют протокол SOManagedObject. Я попытался определить это так:
@interface NSManagedObject <SOManagedObject> (MyExtensionMethods)
...
@end
... но это не похоже на действительность. Как определить категорию, которая добавляет методы к классам, которые реализуют определенный протокол?
4 ответа
Определение такой категории для всех таких классов в общем случае нелегко решить. Но ваша настоящая проблема кажется проще: как добавить метод категории к NSManagedObject
для использования только с подклассами, которые реализуют <SOManagedObject>
? Это разрешимо.
Что вы хотите сделать, это добавить метод NSManagedObject
затем убедитесь, что экземпляр, с которым вы работаете, может обрабатывать сообщения, с которых вы хотите отправить его. <SOManagedObject>
,
Давайте предположим, что нам дано:
/* SOManagedObject.h */
@protocol SOManagedObject
- (void)frobble_so;
- (void)bobble_so;
@end
Теперь давайте добавим метод категории ко всем NSManagedObject
подклассы, которые реализуют SOManagedObject
:
/* NSManagedObject+SOConvenience.h */
@interface NSManagedObject (SOConvience)
/* Frobbles and bobbles - no effect on non-<SOManagedObject>-conforming
* instances. */
- (void)frobbleAndBobble_so;
@end
Для этого мы реализуем метод следующим образом:
/* NSManagedObject+SOConvenience.m */
@implementation NSManagedObject (SOConvenience)
- (void)frobbleAndBobble_so
{
if (![self conformsToProtocol:@protocol(SOManagedObject)]) return;
NSLog(@"%s: Thunderbirds are GO! Let's frobble and bobble!", __func__);
[self frobble_so];
[self bobble_so];
}
@end
Вы можете при желании подтвердить, что вы не отправляете метод неправильным объектам, или вы можете использовать respondsToSelector:
вместо проверки на соответствие протокола. Все, что плывет на твоей лодке, но этот общий способ должен привести тебя туда, куда ты хочешь.
Я не думаю, что это возможно. На вопрос, аналогичный этому, был дан ответ ранее:
Адам Шарп опубликовал решение, которое сработало для меня.
Он включает в себя 3 шага:
- Определение методов, которые вы хотите добавить как
@optional
по протоколу. - Заставить объекты, которые вы хотите расширить, соответствовать этому протоколу.
- Копирование этих методов в эти объекты во время выполнения.
Проверьте ссылку для получения полной информации.
Изменить: я неправильно понял вопрос; Я не думаю, что можно делать то, что вы пытаетесь сделать, не вмешиваясь в среду выполнения Objective-C. См. Комментарий Дэйва ниже, почему мой ответ неверен.
Вы должны быть в состоянии сделать это, если поменяете местами протокол и обозначение категории следующим образом:
@interface NSManagedObject (MyExtensionMethods) <SOManagedObject>
...
@end