NSUserDefaultsのキーとして定数NSStringを使用する


86

NSUSerDefaultsを使用してユーザー設定を保存しています。キーを定数として設定するのは良い考えだとどこかで読んだことを覚えています-そして私は同意します。次のコードは私が現在持っているものです:

[[NSUserDefaults standardUserDefaults]
        setObject:[NSNumber numberWithInt:polygon.numberOfSides] 
           forKey:@"polygonNumberOfSides"];

これを次のように変更してみました:

@implementation Controller

NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";

-(void)savePolygonInfo {
    [[NSUserDefaults standardUserDefaults]
            setObject:[NSNumber numberWithInt:polygon.numberOfSides] 
               forKey:kPolygonNumberOfSides];
}

これは機能しますが、「warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type」を生成します。私は自分のコードをコンパイラの警告から解放したいと思っています。この警告を修正するにはどうすればよいですか?

回答:


207

次を使用する必要があります。

NSString * const kPolygonNumberOfSides = @"..."; // const pointer

の代わりに:

NSString const * kPolygonNumberOfSides = @"..."; // pointer to const

1つ目はNSStringオブジェクトへの定数ポインターであり、2つ目は定数NSStringオブジェクトへのポインターです。

微妙な違いです。コンパイラの警告setObject:forKey:は、次のように宣言されているために発生します。

- (void)setObject:(id)value forKey:(NSString *)defaultName;

defaultName引数は型であることが期待されていますNSString *。代わりに定数へのポインタを渡すと、別の何かが与えられます。

更新:これらの定数はstatic、単一のファイル内からのみ使用されるかのように定義する必要があることを指摘したいと思います。私自身がこの問題に遭遇したので、これを言います。静的として宣言しないと、グローバル名前空間に存在し、別のファイルで同じ名前の変数を使用できなくなります。詳細については、Objective-Cの定数を参照してください。例で説明すると、これは私が現在1つの.mファイルでのみ使用する必要があるキーに使用しているものです。

static NSString * const kSomeLabel = @"...";

1
NSString * const foo なぜなら NSString不変で、ポインタは不変であるので、それが正しい変えることはできませんか?また、const暗黙的にstatic(コンパイラの最適化)であるC ++を思い出すので、呼び出す必要はありません。ここでもそうですか?
2015

32

constObjective-Cオブジェクトと一緒に使用しないでください。実際にはそれを使用するように設計されていません。 NSStringオブジェクト(他の多くのオブジェクトの中でも)は、その設計のおかげでデフォルトですでに不変であるため、オブジェクトを作成してconstも意味がありません。

以下のようe.Jamesが提案、あなたが使用することができますNSString * constへの定数ポインタです、NSString。これは、定数へのポインタであるconst NSString *(と同等NSString const *)とは微妙に異なりますNSString。を使用すると、新しいオブジェクトを指すようにNSString * const再割り当てできなくなります。kPolyNSString


constの使用についての良い点。そのため、多くのObjective-Cクラスには「Mutable」バリアントがあります。
e.James 2009

2
それはconstまた、あなたがそれを再割り当てすることができないことを意味すると思いました。私はそれが間違っていたと思います。
ダンローゼンスターク2011

18

他のクラスからのアクセスの場合:

.h

extern NSString * const PolygonNumberOfSidesPrefsKey;

.m

NSString * const PolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"

現在のクラス内でのみアクセスする場合:

.m

static NSString * const kPolygonNumberOfSidesPrefsKey = @"PolygonNumberOfSides"

5

定数をより説明的にすることをお勧めします。ポリゴンの辺の数の定数は、どこからでも取得できます。提案として、どうですか:

kDefaultsPolygonNumberOfSides;

代わりに。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.