1. ホーム
  2. objective-c

[解決済み] NSUserDefaultsのキーとして定数NSStringを使用する。

2023-04-24 05:15:28

質問

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 を生成します。私は、自分のコードをコンパイラの警告から守りたいのです。どうすればこの警告を修正できますか?

どのように解決するのですか?

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

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

の代わりに

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

はNSStringオブジェクトへの定数ポインタであり、2番目は定数NSStringオブジェクトへのポインタである。

微妙な違いです。コンパイラの警告が起こるのは setObject:forKey: が以下のように宣言されているからです。

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

これは defaultName 引数は NSString * . 代わりに定数へのポインタを渡すと、別のものを与えたことになります。

更新してください。 これらの定数は、以下のように定義されるべきであることを指摘しておきたいと思います。 static として定義されるべきであると指摘したいと思います。もし、staticとして宣言しないなら、それらはグローバルな名前空間に存在することになり、他のファイルで同じ名前の変数を使用することができなくなるからです。 Objective-Cの定数 を参照してください。例で説明すると、私が現在使用しているのは、1つの .m ファイルで使用する必要があります。

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