19

クラスオブジェクトがプロトコルに準拠していることをコンパイラに示す方法はありますか?

私が理解しているように、+(void)fooクラスメソッドを作成することにより、そのクラスオブジェクトのインスタンスはそれらのメソッドをインスタンスメソッドとして持ちます。+(void)fooしたがって、必要なすべてのプロトコル メソッドのメソッドを作成する限り、クラス オブジェクトをデリゲートとして機能させることができます。

もちろん、私の問題は、クラスのヘッダーファイルで、クラスのインスタンスがプロトコルに準拠していることを示す方法しか知らないことです(通常はそうです)。したがって、私が考え出した最善の方法は、クラス オブジェクトを次のようにキャストすることです。

something.delegate = (id<SomethingDelegate>)[self class]

何か案は?

関連するが異なる: ObjC: 「クラス プロトコル」のようなものはありますか?

4

2 に答える 2

19

あなたの目標である警告を黙らせるので、あなたが今していることは正しいです。インスタンスのプロトコルで定義されたクラス オブジェクト メッセージを送信することになりますが、これは少し混乱しますが、ランタイムは気にしません。

このように考えてみてください: プロトコルで定義されたメッセージに応答するオブジェクトにデリゲートを設定したいとします。あなたのクラスはこれを行い、あなたのクラスもオブジェクトです。したがって、クラスをそのプロトコルに準拠するオブジェクトのように扱う必要があります。したがって、あなたが書いたことは完全に正しいです(あなたがやろうとしていることに基づいて)。

ただし、注意すべきことの 1 つは、このクラスはconformsToProtocol:. いずれにせよ、これは通常、デリゲートのセットアップには問題ありません (デリゲートは通常、クラスが準拠しているかどうかをチェックしません。クラスがセレクターに応答できるかどうかをチェックするだけです)。

補足として、構文的にできることの1つは次のとおりです。

Class<SomethingDelegate> variable = (Class<SomethingDelegate>)[self class];

ここでの違いは、コンパイラがインスタンス メッセージの代わりにプロトコルからのクラス メソッドを使用することです。ただし、これはあなたが望むものではありません。

于 2012-04-09T15:18:15.450 に答える
7

メタクラスがプロトコルに準拠していることを示す Objective-C 構文はありません。

class_addProtocolメタクラスで使用することで、実行時に実行できると思います。しかし、私はそれを試していません。

+conformsToProtocol:クラスにメソッドを記述して、適合性について嘘をつくこともできると思います。+conformsToProtocol:(にNSObject加えて)が既に存在するため、これには予期しない副作用が生じる可能性があり-conformsToProtocol:ます。

これらのどちらも、コンパイラをシャットダウンするためのキャストの必要性を排除しません。シングルトンを使用するだけです。

于 2012-04-09T03:02:48.503 に答える