Как определить категорию, которая добавляет методы к классам, которые реализуют определенный протокол?

Я хочу добавить некоторые методы к подклассам 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: вместо проверки на соответствие протокола. Все, что плывет на твоей лодке, но этот общий способ должен привести тебя туда, куда ты хочешь.

Я не думаю, что это возможно. На вопрос, аналогичный этому, был дан ответ ранее:

Определение категорий для протоколов в Objective-C?

Адам Шарп опубликовал решение, которое сработало для меня.

Он включает в себя 3 шага:

  1. Определение методов, которые вы хотите добавить как @optional по протоколу.
  2. Заставить объекты, которые вы хотите расширить, соответствовать этому протоколу.
  3. Копирование этих методов в эти объекты во время выполнения.

Проверьте ссылку для получения полной информации.

Изменить: я неправильно понял вопрос; Я не думаю, что можно делать то, что вы пытаетесь сделать, не вмешиваясь в среду выполнения Objective-C. См. Комментарий Дэйва ниже, почему мой ответ неверен.


Вы должны быть в состоянии сделать это, если поменяете местами протокол и обозначение категории следующим образом:

@interface NSManagedObject (MyExtensionMethods) <SOManagedObject>
    ...
@end
Другие вопросы по тегам