Скажем, я создаю класс и протокол, подобный этому:
@protocol MyProtocol
@required
- (void) doSomething;
@end
@interface MyClass id<MyProtocol>
@property int aNumber;
@end
@implementation MyClass
@synthesize aNumber = aNumber_;
- (void) doSomething { aNumber_++; }
@end
Очевидно, что я могу передавать экземпляры MyClass, обрабатывая их как id<MyProtocol>
s. Я не могу получить доступ к aNumber
, хотя, если я имею дело с чем-то объявленным как id<MyProtocol>
. Это ожидается.
Мне нужно было сделать это недавно. Я хотел продолжать использовать протокол для ссылки на экземпляры моего класса (время выполнения определено), но я также хотел получить доступ к свойствам классов. Я обнаружил, что могу сделать это:
@protocol MyProtocol
@required
- (void) doSomething;
- (int) aNumber;
@end
И теперь везде, где у меня есть экземпляр id<MyProtocol>
, я также могу вызывать [instance aNumber]
, без необходимости напрямую кодировать средства доступа - вызов synthesise
эффективно реализует для меня эту часть протокола , Я мог бы также добавить сеттер, если захочу.
Я наткнулся на преднамеренную особенность или это плохая идея, которая в итоге вызовет у меня проблемы в будущем?
Спасибо