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 に答える