0
@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
4

2 回答 2

2

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

- (BOOL)conformsToProtocol:(Protocol *)aProtocol

您可以使用它来测试对象是否符合特定协议。对于更细粒度的控制,您可以使用:

- (BOOL)respondsToSelector:(SEL)selector

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

于 2011-06-28T02:11:57.427 回答
0

“在运行时符合 Duck 协议”

您不能“在运行时遵守协议”。您可以使用respondsToSelector:检查在运行时检查选择器。但是,我相信这仍然不适用于通过valueForUndefinedKey:.

于 2011-08-08T23:39:54.923 回答