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」を生成します。私は自分のコードをコンパイラの警告から解放したいと思っています。この警告を修正するにはどうすればよいですか?

4

4 に答える 4

211

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

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 = @"...";
于 2009-04-15T21:31:18.160 に答える
32

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

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

于 2009-04-15T21:37:05.683 に答える
5

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

kDefaultsPolygonNumberOfSides;

代わりは。

于 2009-04-18T12:14:14.383 に答える