如何在运行时确保协议一致性?

时间:2011-06-28 01:51:32

标签: objective-c runtime protocols duck-typing

@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机制,并且在运行时符合Duck协议?

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

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

2 个答案:

答案 0 :(得分:2)

不确定我理解你的问题,但NSObject上有方法:

- (BOOL)conformsToProtocol:(Protocol *)aProtocol

您可以使用它来测试对象是否符合特定协议。要获得更精细的控制,您可以使用:

- (BOOL)respondsToSelector:(SEL)selector

测试对象在发送之前是否会响应消息。

答案 1 :(得分:0)

“在运行时符合Duck协议”

您不能“在运行时遵守协议”。您可以使用respondsToSelector:检查在运行时检查选择器。但是,我认为这仍然不适用于通过valueForUndefinedKey:处理的邮件。