2011-06-28 15 views
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メカニズムを活用し、実行時にアヒルのプロトコルに準拠するために使用することができますか?

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

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

'return YES' YESはオブジェクトではありません – user102008

答えて

2

ない私はあなたの質問を理解しますが、NSObjectの上の方法があることを確認:

- (BOOL)conformsToProtocol:(Protocol *)aProtocol 

オブジェクトが特定のプロトコルに準拠している場合は、テストするためにこれを使用することができます。より詳細な制御を行うには、次のものを使用できます。

- (BOOL)respondsToSelector:(SEL)selector 

オブジェクトがメッセージを送信する前にそれに応答するかどうかをテストします。

+0

クラスがそのプロトコルを実装すると宣言されていない限り、conformsToProtocolは機能しません – user102008

0

あなたは、「実行時のプロトコルに準拠して、」できません「実行時にアヒルのプロトコルに準拠します」。実行時にrespondsToSelector:チェックを使用してセレクタをチェックすることができます。しかし、私はそれがまだvalueForUndefinedKey:で処理されるメッセージではうまくいかないと信じています。