2

基本的に、iPhoneアプリに、読み取り専用のプロパティをいくつか設定したいクラスがあります。つまり、所有するクラスはプロパティの読み取りと書き込みを行うことができますが、他のオブジェクトはプロパティの読み取りのみを行うことができます。プロパティを宣言するときに「読み取り専用」オプションを試しましたが、クラスはそれを書き込むことさえできません。それは何の用途ですか?

4

5 に答える 5

7

クラスに、、fooというプロパティを作成したいとします。intYourClass

インターフェイス(.h)ファイルでこれを行います。

@property(readonly) int foo;

次に、実装(.m)ファイルで、プロパティを再定義できるクラス拡張子を設定します。

@interface YourClass()

@property(readwrite) int foo;

@end

これにより、プロパティはreadonly公開されますが、readwrite非公開になります。

次に、もちろん、foo次の実装で合成します。

@synthesize foo;
于 2012-04-13T21:52:19.740 に答える
3

それほど不便ではない場合は、クラスのivarまたは「backing」変数を使用して値を変更します。このような:

.hファイル内:

@interface ClassName

@property (readonly,nonatomic) NSInteger readOnlyValue;

@end

.mファイル内:

@implementation ClassName

@synthesize readOnlyValue = _readOnlyValue;



_readOnlyValue = 42;

@end
于 2012-04-13T21:39:18.747 に答える
2

他の回答で説明されているように、直接iVarアクセス​​のルートをたどることもできますが、より良い解決策は通常、クラス拡張を使用することです。これらはこの問題を解決するために正確に設計されており、それらを使用することで、後でコードを簡単にリファクタリングして、すべてのクラスに公開せずに、アプリ内の他のクラスにreadwrite定義を公開できます。@property

少し前に詳しい説明を書きました。

于 2012-04-13T21:52:02.270 に答える
0

.mクラスに独自のセッターを実装するか、次のように合成できます。foo = _foo; したがって、内部で_foo(プライベート変数)を呼び出すことができます

于 2012-04-13T21:37:19.293 に答える
0

さらに考えてみると、これを実現する最も簡単な方法は、クラス拡張に通常のプロパティを追加してから、ヘッダーでゲッターだけを宣言することです。例えば

インターフェース:

@interface MyClass: NSObject

- (NSString *)someString;

@end

実装:

@interface MyClass ()
@property (nonatomic, retain) NSString *someString;
@end

@implementation MyClass

@synthesize someString;

@end

someStringドット表記などを使用して取得および設定し、クラス内のインスタンス変数に直接アクセスできます。また、インターフェイスを確認できるすべてのユーザーが、ドット表記などを使用して取得できます。

于 2012-04-13T21:42:24.720 に答える