0

Constants というシングルトン クラスがあり、そこにアプリ全体の定数を設定する必要があります。これらの定数を読み取り専用にしたいと思います。それで、Constants.hファイルで次のことを行いました

 @interface Constants : NSObject
 {

 }

 @property (nonatomic, readonly)double U_LAT;
 @property (nonatomic, readonly)double U_LNG;

次に、.mファイルでこのメソッドを取得しました

 -(id)init
 {
     self = [super init];

     self.U_LAT = 49.2765;
     self.U_LNG = -123.2177;

     return self;
 }

このコードからこのエラーが発生します。

 Assignment to readonly property

init メソッドで readonly 変数を初期化できませんか? そうでない場合、どうすれば初期化できますか?

4

3 に答える 3

10

self.propertyName = val;と同じ[self setPropertyName:val];-- セッター メソッドが存在する必要があります。読み取り専用プロパティにはセッター メソッドがありません。

ただし、プロパティを直接サポートする ivar を設定できます。

-(id)init
 {
     self = [super init];

     _U_LAT = 49.2765;
     _U_LNG = -123.2177;

     return self;
 }

プロパティの自動合成を許可している場合、ivar の名前はプロパティ名にアンダースコアを付けたものになります。明示的な がある場合@synthesize propName;、ivar は同じ名前になります。また、synthesize ステートメントを使用して、任意の名前で変数を作成することもできます。@synthesize cat = dog;

また、プロパティをパブリックに読み取り専用にすることもできますが、クラスによって書き込み可能にすることもできます。これには、クラス拡張でセッター メソッドを宣言するか、拡張でプロパティを再宣言することが含まれます。

于 2013-02-02T20:09:38.970 に答える
5

次のように、プライベート インターフェイスでプロパティを再宣言することをお勧めします。

// .h

@interface Constants : NSObject
@property(nonatomic, readonly) double U_LAT;
@end

// .m

@interface Constants ()
@property(nonatomic, readwrite) double U_LAT;
@end

はい、inits と dealloc では、変数を _U_LAT として直接参照します。

于 2013-02-02T20:13:51.657 に答える
0

プロパティとしてではなく、定数として宣言する方がよいでしょう。

.hファイルで、次のコードを の上に追加します@interface

extern double const U_LAT;
extern double const U_LNG;

次に、.mファイルの の上に次のコードを追加します@interface

double const U_LAT = 49.2765;
double const U_LNG = -123.2177;

U_LATとは、U_LNGをインポートするすべてのクラスで使用できConstants.h、プロパティやインターフェイスを扱う必要はありません。

発明されたのはまさにこの種のものですconst

于 2013-02-03T06:46:02.730 に答える