web-dev-qa-db-ja.com

NSUserDefaults-キーが存在するかどうかを確認する方法

私は小さなiPhoneアプリで作業しており、NSUserDefaultsをデータの永続性として使用しています。いくつかの名前や数字など、いくつかのことを追跡するだけでよいので、単純にすることをお勧めします。

参照用に このページ を見つけましたが、質問に答えられるとは思いません。基本的に、NSUserDefaultsに値(またはキー)が既に存在するかどうかを確認し、それに応じて何かを実行できるようにします。

いくつかの例:アプリが起動します。初めて起動する場合は、ようこそという警告を出力します。これが初めて開いたかどうかを判断するために、UserDefaultsを読み取り、チェックします。

例2:「Hello [Name]」と表示されます。Nameは入力したものです。アプリを開いて名前がない場合は、「Hello World」と表示されます。すでに名前を入力しているかどうかを確認し、それに応じて行動する必要があります。名前はNSUserDefaultsに保存されます。

ここでいくつか助けますか?本当に感謝しています!

202
Ethan Mick

objectForKey:は、存在しない場合はnilを返します。

376
jspcal

上記のように、0/NOが有効な値になる可能性があるプリミティブ型では機能しません。このコードを使用しています。

NSUserDefaults *defaults= [NSUserDefaults standardUserDefaults];
if([[[defaults dictionaryRepresentation] allKeys] containsObject:@"mykey"]){

    NSLog(@"mykey found");
}
93
i.jameelkhan

値が存在しない場合、objectForKey:メソッドはnilを返します。以下は、値がnilかどうかを示す簡単なIF/THENテストです。

if([[NSUserDefaults standardUserDefaults] objectForKey:@"YOUR_KEY"] != nil) {
    ...
}
54
mirap

"存在しない場合、objectForKeyはnilを返します。"存在する場合、nilを返します。整数または値がゼロのブール値(つまり、ブール値)。

5.1と6.1の両方のシミュレータでこれをテストしました。これは、「オブジェクト」を要求することによって設定された整数またはブール値を実際にテストできないことを意味します。 「設定されていない」を「ゼロに設定されている」ように扱うことを気にしない場合は、整数でこれを回避できます。

これをすでにテストした人は、偽陰性の側面にだまされているようです。つまり、キーが設定されていないことがわかっているときにobjectForKeyがnilを返すかどうかを確認することでこれをテストしますが、キーが設定されていますが、NOに設定されています。

ここに送られた自分の問題については、ブール値のセマンティクスを変更したため、値がNOに設定されていることを希望のデフォルトと一致させました。それがオプションではない場合、ブール値以外の何かとして保存し、YES、NO、および「未設定」の違いを伝えることができることを確認する必要があります。

6
JamesKVL

Swift 3/4:

UserDefaultsを介してアクセスされる他の型のOptional-return動作を模倣する、Int/Double/Float/Boolキー値型の簡単な拡張を次に示します。

2018年8月30日編集: Leoの提案によるより効率的な構文で更新されました。)

extension UserDefaults {
    /// Convenience method to wrap the built-in .integer(forKey:) method in an optional returning nil if the key doesn't exist.
    func integerOptional(forKey: String) -> Int? {
        return self.object(forKey: forKey) as? Int
    }
    /// Convenience method to wrap the built-in .double(forKey:) method in an optional returning nil if the key doesn't exist.
    func doubleOptional(forKey: String) -> Double? {
        return self.object(forKey: forKey) as? Double
    }
    /// Convenience method to wrap the built-in .float(forKey:) method in an optional returning nil if the key doesn't exist.
    func floatOptional(forKey: String) -> Float? {
        return self.object(forKey: forKey) as? Float
    }
    /// Convenience method to wrap the built-in .bool(forKey:) method in an optional returning nil if the key doesn't exist.
    func boolOptional(forKey: String) -> Bool? {
        return self.object(forKey: forKey) as? Bool
    }
}

これらは、他の組み込みgetメソッド(文字列、データなど)と並んでより一貫しています。古いメソッドの代わりにgetメソッドを使用するだけです。

let AppDefaults = UserDefaults.standard

// assuming the key "Test" does not exist...

// old:
print(AppDefaults.integer(forKey: "Test")) // == 0
// new:
print(AppDefaults.integerOptional(forKey: "Test")) // == nil
4
stef

UserDefaultsを1回拡張して、このソリューションをコピーアンドペーストしないようにします。

extension UserDefaults {

    func hasValue(forKey key: String) -> Bool {
        return nil != object(forKey: key)
    }
}

// Example
UserDefaults.standard.hasValue(forKey: "username")
3
mbelsky

Bool?を取得するSwiftバージョン

NSUserDefaults.standardUserDefaults().objectForKey(DefaultsIsGiver) as? Bool
3
Ben

この小さなクランペットを試してください:

-(void)saveUserSettings{
NSNumber*   value;

value = [NSNumber numberWithFloat:self.sensativity];
[[NSUserDefaults standardUserDefaults] setObject:value forKey:@"sensativity"];
}
-(void)loadUserSettings{
    NSNumber*   value;
    value = [[NSUserDefaults standardUserDefaults] objectForKey:@"sensativity"];
    if(value == nil){
        self.sensativity = 4.0;
    }else{
        self.sensativity = [value floatValue];
    }
}

すべてをオブジェクトとして扱います。私のために働くようです。

3
pepelkod

私はちょうどこれを経験しましたが、あなたの答えのallは、私にとっては良い解決策に向かってくれました。読んだり理解したりするのが難しいと思ったからといって、提案されたルートに行くのを拒みました。

これが私がしたことです。 「_talkative」という変数でBOOLを持ち歩いていました。

デフォルト(NSUserDefaults)オブジェクトを設定するとき、nil:であるかどうかをテストするためにオブジェクトとして設定します。

//converting BOOL to an object so we can check on nil
[defaults setObject:@(_talkative) forKey:@"talkative"];

次に、存在するかどうかを確認するために行ったとき、私は使用しました:

if ([defaults objectForKey:@"talkative"]!=nil )
  {

次に、オブジェクトをブールとして使用しました。

if ([defaults boolForKey:@"talkative"]) {
 ...

これは私の場合はうまくいくようです。それは私にとってより視覚的に意味がありました。

2
james Burns

Swift3では、このように使用しました

var hasAddedGeofencesAtleastOnce: Bool {
    get {
        return UserDefaults.standard.object(forKey: "hasAddedGeofencesAtleastOnce") != nil
    }
}

answer は、複数回使用する場合に最適です。

私はそれが役立つことを願っています:)

0
Nikhil Manapure