私はobjective-Cを学んでおり、拡張機能を使用してプライベートメンバーをインターフェースに追加できることを知っています。
しかし、本は () には何もないはずだと言った
次のコードスニペットを読みました
@interface Tree(Private)
- (void)blah:(int)num;
@end
() の中になぜ Private があるのか不思議です。
私はobjective-Cを学んでおり、拡張機能を使用してプライベートメンバーをインターフェースに追加できることを知っています。
しかし、本は () には何もないはずだと言った
次のコードスニペットを読みました
@interface Tree(Private)
- (void)blah:(int)num;
@end
() の中になぜ Private があるのか不思議です。
クラス カテゴリの宣言には、通常、そのカテゴリの目的を示す任意の名前を付けることができます。
したがって、あなたの場合、コードの作成者は、これらのメソッドがクラス自体の内部使用のためのものであり、他のクラスから呼び出されることを意図していないことを伝えたかったのです
あなたの例の宣言は、正確にはカテゴリと呼ばれます(拡張ではありません)。
任意のクラスに好きなだけカテゴリを追加できます (ソース コードにアクセスできない場合でも)。カテゴリを使用すると、新しいメソッドをクラスに追加できますが、新しい ivar やプロパティを追加することはできません。[1]
各カテゴリには名前があり、これは括弧の間のビットです。同じクラスに同じ名前の2 つの異なるカテゴリがあってはなりません。
名前が空の場合、これはextensionと呼ばれます。拡張機能には、カテゴリとの若干の違いがあります。拡張機能に ivar とプロパティを追加でき、ソース コードにアクセスできるクラスにのみ使用できます。[1]
通常、拡張機能(本の例のように) はファイルの先頭で宣言され、.m
そのファイル (通常は単一のクラスで構成される) 内でのみ使用されるメソッド、ivar、および/またはプロパティを宣言するために使用されます。
PD:拡張機能ではなくカテゴリを通じて新しいプロパティを本当に追加したい場合は、関連付けられたオブジェクトを使用して実際に行うことができます [2][3]。
カテゴリと見なされる場合ですが、.m ファイル上にあるため、同じ効果があります。Xcode からのヒントも参照できます。
中間のものであることTree(description)
は、最後のもののようなものと考えられていましたTree ()
ここには、クラス カテゴリとクラス拡張という 2 つの密接に関連する概念があります。クラス カテゴリは、括弧内に名前を含み、既存のクラスにメソッドを追加したり、メソッドを論理グループに編成したりするために最も一般的に使用されます。クラス拡張は、クラスの内部実装を拡張します (つまり、プライベート プロパティ、メソッドなどを定義するために使用されます)。
詳細については、Apple の開発者サイトをご覧ください。