2009-08-27 15 views
19

Objective-CではこのC#プロパティのようなプロパティを作成する方法はありますか?基本的にCでObjective-C相当のget/protectedセットプロパティとは何か

public int prop { get; protected set;} 

、私はクラスの外から値を取得することを可能にしたいのですが、唯一のクラスの中から値を設定することができます。

+1

実際にprotectedには特別な意味があります。つまり、派生クラスにアクセスできることも意味します。 –

+0

私のために保護された、または私的に機能します。 :-) –

答えて

24

これを実現する最も簡単な方法は、(つまり、.hファイル)MyClassのためにパブリックインターフェイスにreadonlyとしてプロパティを宣言することです:

@property (readonly) NSInteger prop; 

すると、そのクラスの.Mファイルに、宣言クラスextension(名前が空のカテゴリ)。

もちろん
@interface MyClass() 
@property (readwrite) NSInteger prop; 
@end 

@implementation MyClass 
@synthesize prop; 
... 
@end 

は、Objective-Cのは、アクセス制限を強制しませんので、-[MyClass setProp:]を呼び出してから、いくつかの不正なコードを止めるものは何もありません:クラスの拡張では、redeclare @propertyはREADWRITEするために、その書き込み可能性を変更することがあります。コンパイラはこれを警告として表示しますが、これはObjective-Cの場合と同じくらい良いものです。残念ながら、この「保護された」書き込み可能プロパティをサブクラスに文書化する標準的な方法はありません。あなたのチームのためのコンベンションに落ち着かなければならないでしょうし、リリースしようとしているフレームワーク内にあれば、そのクラスの公開ドキュメントに入れなければなりません。

+0

'readwrite'はデフォルトではありませんか?それを指定する必要はありますか? –

+0

@RaffiKhatchadourianでは、 'readwrite'がデフォルトですが、' readonly'元の宣言をオーバーライドするクラス拡張では、 'readwrite'が必要です。 –

+0

@BarryWark - あなたはそれについて間違っています。それを試してみてください。 'readwrite'がデフォルトであるので、プロパティの再宣言はデフォルトで' readwrite'として再宣言します。それがデフォルトであることを意味します。 :) – matt

1

は、私はあなたがhere続きを読む@property

@property (readonly) NSInteger prop; 

にreadonly属性を探していると信じています。

+0

しかし、そのプロパティを使うのではなく、その背後にある値に直接アクセスする必要はありませんか? –

+0

ええ、クラス内でのみ値を設定したい場合は、実際にself.prop構文を使う必要はありません。単にpropを直接参照するだけです。 readonly属性は、クラス外のものは値を取得することしかできないことを保証します。 – keno

+0

これは不完全な答えです。クラス拡張のプロパティを再宣言して読み込み可能にすることができます。 –

1

ObjCで@ private/@ protectedメソッドを作成する方法はありませんが、これらのコンパイラ指示はインスタンス変数にのみ適用されます。ただし、静的なC関数を同じファイルに宣言して、 "@private"メソッドを取得することはできます。

ケノの答えはこれを達成する最も正しい方法のようです。

関連する問題