Как обеспечить соответствие протокола во время выполнения? - PullRequest
0 голосов
/ 28 июня 2011
@interface Dog : NSObject
@end

@implementation Dog
- (id)valueForUndefinedKey:(NSString *)key
{
    if ([key isEqualToString:@"quacks"])
        return YES;
}
@end

Вышесказанное позволяет использовать KVC и писать что-то вроде:

[[Dog new] valueForKey:@"quacks"]; // YES

Однако можно ли использовать среду выполнения objc для использования того же механизма KVC И соответствоватьпротокол утки во время выполнения?

@protocol Duck <NSObject>
@optional
  @property (readonly) BOOL quacks;
@end

id<Duck> dug = (id<Duck>)[Dog new];
dug.quacks; // YES

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

Не уверен, что понимаю ваш вопрос, но есть метод на NSObject:

- (BOOL)conformsToProtocol:(Protocol *)aProtocol

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

- (BOOL)respondsToSelector:(SEL)selector

чтобы проверить, будет ли объект отвечать на сообщение перед его отправкой.

0 голосов
/ 09 августа 2011

"соответствовать протоколу Duck во время выполнения"

Вы не можете "соответствовать протоколу во время выполнения". Вы можете использовать проверку respondsToSelector: для проверки селектора во время выполнения. Тем не менее, я считаю, что это все равно не будет работать для сообщений, обработанных через valueForUndefinedKey:.

...