質問
プロトコルを採用するインスタンス変数オブジェクトが欲しい。
@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
Layer *content <CocosNodeOpacity>;
}
たとえば、メソッドを取得できるように、Layerオブジェクトに<CocosNodeOpacity>
を採用させたい
-(GLubyte) opacity; //and
-(void) setOpacity: (GLubyte) opacity;
無料。上記の構文は無効です。新しい実装ファイルを作成してカスタムオブジェクトを作成せずにこれを達成することは可能ですか?ありがとう。
解決
これらがすべて作成したコードである場合、これを行う最善の方法は、おそらくLayer
クラス自体に変数ではなくプロトコルを採用させることです。
@interface Layer : NSObject <CocosNodeOpacity> { ... }
このアプローチの主な利点は、コンパイル時にプロトコルで必要なすべてのメソッドを実装したかどうかをコンパイラがチェックすることです。これは通常、必要なことです。標準クラスの残りの実装と同じ場所にメソッドを追加すると、カテゴリを使用するよりも理解しやすく(魔法のコードがどこから来たのかを探すのに苦労しません)(異なるカテゴリで同じメソッドを追加すると、未定義の動作が発生する可能性があります) 。原則として、(クローズドソースの)サードパーティコードにメソッドを追加するなど、持っているときのみカテゴリを使用します。
id
のソースを制御しない場合、ivarを宣言するときに代わりにこれを使用する必要がある場合があります。
Layer<CocosNodeOpacity> *content;
プロトコルを採用すると、クラス型を持つ変数を静的に入力でき、メソッドが存在しない場合はコンパイル警告が表示されることに注意してください。ただし、メソッドを実装する必要があるため、メソッド<!> quot; for free <!> quot;を取得することはできません。それでも、プロトコルと静的型付けを慎重に使用すると、コードがより堅牢になり、<!> quot; fail-fast <!> quot;すべてのタイプとして <=> を使用するよりも。簡単な方法をとるだけでなく、称賛されるべきです。 :-)
プロトコルの詳細(必須およびオプションのメソッドを含む)については、 SOの回答をご覧ください。
他のヒント
Objective-Cのプロトコルは、Javaのインターフェースに似ています。このプロトコルは一連の機能を定義し、コントラクトとして機能します。 <!> quot;このオブジェクトが何であれ、これらのメソッドがあることを保証します。<!> quot;
最初のコードブロックの構文についてはかなり理解できました。実際には次のようになります:
@interface GameScene : Scene <AVAudioPlayerDelegate> {
@private
Layer<CocosNodeOpacity> * content;
}
ただし、Layerクラスで不透明度のメソッドを定義する必要はありません。プロトコルを使用して、クラスにこれらの機能があることを確認しましたが、実際にはそれらを提供していません。引き続きそれらのコードを記述する必要があります。
あなたが探しているのはObjective-Cカテゴリだと思います。カテゴリは、実行時にメソッドを追加することにより、クラスの機能を拡張する方法を提供します。 Objective-Cは完全に動的な言語であるため、可能です。 Layerクラスの作成者ではなく、不透明度メソッドを簡単に追加できない場合は、カテゴリが最適です。場合によっては、カテゴリは非常に便利です。既存のクラスソースがなくても、NSStringやNSColorなどの組み込みクラスにメソッドを追加できます。
ここには、スタックオーバーフローに関するカテゴリのドキュメントがたくさんあります。アップルのドキュメントも非常に優れています。始めるための記事を次に示します。
http://macdevelopertips.com/objective-c/objective-c -categories.html