@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
答案 0 :(得分:2)
不确定我理解你的问题,但NSObject上有方法:
- (BOOL)conformsToProtocol:(Protocol *)aProtocol
您可以使用它来测试对象是否符合特定协议。要获得更精细的控制,您可以使用:
- (BOOL)respondsToSelector:(SEL)selector
测试对象在发送之前是否会响应消息。
答案 1 :(得分:0)
“在运行时符合Duck协议”
您不能“在运行时遵守协议”。您可以使用respondsToSelector:
检查在运行时检查选择器。但是,我认为这仍然不适用于通过valueForUndefinedKey:
处理的邮件。