如何保证运行时协议的一致性?

发布于 2024-11-17 16:48:30 字数 512 浏览 7 评论 0原文

@interface Dog : NSObject
@end

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

上面的代码允许利用 KVC 并编写如下内容:

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

但是,objc 运行时是否可以利用相同的 KVC 机制,并在运行时遵守 Duck 协议?

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

id<Duck> dug = (id<Duck>)[Dog new];
dug.quacks; // YES
@interface Dog : NSObject
@end

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

The above allows to leverage KVC and write something like :

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

However, can the objc runtime be used to leverage the same KVC mechanism, AND conform to the Duck protocol at runtime ?

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

静若繁花 2024-11-24 16:48:30

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

- (BOOL)conformsToProtocol:(Protocol *)aProtocol

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

- (BOOL)respondsToSelector:(SEL)selector

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

Not sure I understand your question, but there is the method on NSObject:

- (BOOL)conformsToProtocol:(Protocol *)aProtocol

You can use this to test if an object conforms to a particular protocol. For more fine grained control you can use:

- (BOOL)respondsToSelector:(SEL)selector

to test if an object will respond to a message before sending one.

紫﹏色ふ单纯 2024-11-24 16:48:30

“在运行时遵守 Duck 协议”

您不能“在运行时遵守协议”。您可以使用 respondsToSelector: 检查在运行时检查选择器。但是,我相信这对于通过 valueForUndefinedKey: 处理的消息仍然不起作用。

"conform to the Duck protocol at runtime"

You cannot "conform to a protocol at runtime". You can use the respondsToSelector: check to check for a selector at runtime. However, I believe that that will still not work for messages handled via valueForUndefinedKey:.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文