4

別のオブジェクトからオブジェクトをラップする 1 つのクラス階層にオブジェクトを作成する必要があります。どちらも非常に似たインターフェースを持っており、独自のプロパティを実装する代わりに、ラッパーが認識しないメッセージをターゲットに自動的に転送したいと考えています。私はこれを次のようなものを使って動作させました:

- (id)forwardingTargetForSelector:(SEL)sel
{
    if ([self.wrappedObject RespondsToSelector:sel])
        self.wrappedObject を返します。

    自分自身を返します。
}

ただし、これはキー値コーディングでは機能しません。ラップされたオブジェクトのプロパティを使用する方法でラッパーにキー値コーディングを実装させるにはどうすればよいですか?

4

1 に答える 1

1

と を上書きする必要がvalueForKey:ありますsetValue:forKey:。例:

- (id)valueForKey:(NSString *)key {
  if (/* wrapped object has key */)
    return [self.wrappedObject valueForKey: key];
  else
    return [super valueForKey: key];
}

トリッキーな部分は、ラップされたオブジェクトが実装するキーを決定することです。簡単な方法はそれらをハードコードすることですが、それはあまり良い方法ではありません。非常に一般的なことをしたい場合は、Objective-C のリフレクション API を使用して何かを行います。以下に 2 つのアイデアを示します。

  • すべてのプロパティは実際に宣言されたプロパティです。ランタイム関数 class_getProperty を使用してその存在を確認し、必要に応じて追加情報を抽出できます。チェックは次のようになりますif (class_getProperty([self.wrappedObject class], [key UTF8String]) != nil) {...}

  • プロパティにアクセサーのみを含めることもできます。次に、キーからセレクターを構築し、[self.wrappedObject respondsToSelector: ...]以前と同じように使用する必要があります。getter の名前は、キーとコロンです。ただし、これに関する問題は、getter/setter 名が異なるプロパティです。最初のオプションが間違いなく最適です。

于 2010-08-25T18:39:03.450 に答える