基本的に、iPhoneアプリに、読み取り専用のプロパティをいくつか設定したいクラスがあります。つまり、所有するクラスはプロパティの読み取りと書き込みを行うことができますが、他のオブジェクトはプロパティの読み取りのみを行うことができます。プロパティを宣言するときに「読み取り専用」オプションを試しましたが、クラスはそれを書き込むことさえできません。それは何の用途ですか?
5 に答える
クラスに、、foo
というプロパティを作成したいとします。int
YourClass
インターフェイス(.h)ファイルでこれを行います。
@property(readonly) int foo;
次に、実装(.m)ファイルで、プロパティを再定義できるクラス拡張子を設定します。
@interface YourClass()
@property(readwrite) int foo;
@end
これにより、プロパティはreadonly
公開されますが、readwrite
非公開になります。
次に、もちろん、foo
次の実装で合成します。
@synthesize foo;
それほど不便ではない場合は、クラスのivarまたは「backing」変数を使用して値を変更します。このような:
.hファイル内:
@interface ClassName
@property (readonly,nonatomic) NSInteger readOnlyValue;
@end
.mファイル内:
@implementation ClassName
@synthesize readOnlyValue = _readOnlyValue;
_readOnlyValue = 42;
@end
他の回答で説明されているように、直接iVarアクセスのルートをたどることもできますが、より良い解決策は通常、クラス拡張を使用することです。これらはこの問題を解決するために正確に設計されており、それらを使用することで、後でコードを簡単にリファクタリングして、すべてのクラスに公開せずに、アプリ内の他のクラスにreadwrite
定義を公開できます。@property
少し前に詳しい説明を書きました。
.mクラスに独自のセッターを実装するか、次のように合成できます。foo = _foo; したがって、内部で_foo(プライベート変数)を呼び出すことができます
さらに考えてみると、これを実現する最も簡単な方法は、クラス拡張に通常のプロパティを追加してから、ヘッダーでゲッターだけを宣言することです。例えば
インターフェース:
@interface MyClass: NSObject
- (NSString *)someString;
@end
実装:
@interface MyClass ()
@property (nonatomic, retain) NSString *someString;
@end
@implementation MyClass
@synthesize someString;
@end
someString
ドット表記などを使用して取得および設定し、クラス内のインスタンス変数に直接アクセスできます。また、インターフェイスを確認できるすべてのユーザーが、ドット表記などを使用して取得できます。