Как добавить свойство «расширение target-c» в анонимный класс, который реализует известный протокол - PullRequest
0 голосов
/ 30 августа 2018

У меня есть существующий класс, для которого у меня нет исходного кода, и я хочу добавить свойство в класс. Закрытый класс реализует known protocol, который доступен, но class type is not exposed.

Произошел некоторый обратный вызов, и я получил объект с именем answer.

Я хочу расширить тип ComplexNumber, чтобы иметь больше свойств, например, * +1008 *

 @interface NSObject()<ComplexNumber>
     @property (assign) BOOL offline;
 @end

 @implementation SomeClass 

 didReceiveAnswer:id<ComplexNumber>answer forEquation:(NSString*)equation {
     //
     if (answer.offline) {
        // 
     }
 }

 @end

Это также не помогает: Приведение unknown type к типу NSObject:

     if (((NSObject*)answer).offline) {
        // 
     }

1 Ответ

0 голосов
/ 30 августа 2018

Здесь, похоже, есть две проблемы:

  • получить доступ к закрытому классу
  • добавить свойство к нему.

Если вы знаете имя частного класса, вы можете просто использовать его, определив его снова:

// SomeClass.h

@interface SomeClass : NSObject <ComplexNumber>

@end

Это может показаться странным, но этого будет достаточно, чтобы пройти этап компиляции вашего процесса сборки и позволить вам использовать это свойство в вашем коде. Существующая реализация частного класса будет достаточной для работы со стадией связи.

Как указывает Даниэла Панталеоне , вторая часть очень близка к Objective-C: свойство / экземпляр переменной в категории . Однако я добавил это для полноты:

// ComplexNumber.h

@protocol ComplexNumber <NSObject>
@property (assign) BOOL offline;
@end

//ComplexNumber.m

@import ObjectiveC;

@implementation NSObject (ComplexNumber)

static void *ComplexNumberKey = &ComplexNumberKey;

-(void)setOffline:(BOOL)offline
{
    objc_setAssociatedObject(self, &ComplexNumberKey, @(offline), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(BOOL)offline
{
    NSNumber *offline = objc_getAssociatedObject(self, &ComplexNumberKey);
    return offline.boolValue;
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...