したがって、プロパティを宣言する必要があるプロトコルがあります。
@protocol MyProtocol <NSObject>
@property MyView *myView;
@end
およびそれに準拠するオブジェクト:
@interface MyViewController : NSViewController <MyProtocol>
@end
ただし、実装ファイル (クラス拡張) 内でプロパティ (プロトコルで指定) を宣言すると、次のようになります。
@interface MyViewController()
@property MyView *myView;
@end
次のエラーが表示されます。
クラス拡張 'MyViewController' のプロパティの再宣言が不正です (属性は 'readwrite' である必要があり、そのプライマリは 'readonly' である必要があります)
これに対処する 2 つの主要な SO スレッドがあるようです:
属性は読み取り書き込みである必要があり、そのプライマリは読み取り専用
である必要があり、
別のウィンドウを宣言できません
最初の答えは何も説明しません
2 番目の回答は、ヘッダー内でプロパティを宣言することにより、このエラーを実際に回避できることを示しています。そして悲しいかな
ヘッダ
@interface MyViewController : NSViewController <MyProtocol>
@property MyView *myView;
@end
実装
@interface MyViewController()
@end
これはエラーなしでビルドされます。
@property
また、プロトコルの内部を宣言しても、自動的に合成されないことも知っています。
@property
したがって、宣言を実装内に保持したい場合は、そうしなければなりませ@synthesize
ん。そして、これも機能します。
だから私の質問は、最初にプロトコル内で宣言された@property
場合、ヘッダーと実装ファイルの内部を宣言することが問題になるのはなぜですか?@property
@property
プロトコルがなければ、唯一の違いはパブリックにするかプライベートにするかだと思いました。@property
しかし、ヘッダーと実装ファイルでa を宣言すると、他のことが起こる/起こらないことが明らかにあります。