私は小さなiPhoneアプリで作業しており、NSUserDefaults
をデータの永続性として使用しています。いくつかの名前や数字など、いくつかのことを追跡するだけでよいので、単純にすることをお勧めします。
参照用に このページ を見つけましたが、質問に答えられるとは思いません。基本的に、NSUserDefaults
に値(またはキー)が既に存在するかどうかを確認し、それに応じて何かを実行できるようにします。
いくつかの例:アプリが起動します。初めて起動する場合は、ようこそという警告を出力します。これが初めて開いたかどうかを判断するために、UserDefaults
を読み取り、チェックします。
例2:「Hello [Name]」と表示されます。Nameは入力したものです。アプリを開いて名前がない場合は、「Hello World」と表示されます。すでに名前を入力しているかどうかを確認し、それに応じて行動する必要があります。名前はNSUserDefaults
に保存されます。
ここでいくつか助けますか?本当に感謝しています!
objectForKey:
は、存在しない場合はnil
を返します。
上記のように、0/NOが有効な値になる可能性があるプリミティブ型では機能しません。このコードを使用しています。
NSUserDefaults *defaults= [NSUserDefaults standardUserDefaults];
if([[[defaults dictionaryRepresentation] allKeys] containsObject:@"mykey"]){
NSLog(@"mykey found");
}
値が存在しない場合、objectForKey:
メソッドはnil
を返します。以下は、値がnilかどうかを示す簡単なIF/THENテストです。
if([[NSUserDefaults standardUserDefaults] objectForKey:@"YOUR_KEY"] != nil) {
...
}
"存在しない場合、objectForKeyはnilを返します。"存在する場合、nilを返します。整数または値がゼロのブール値(つまり、ブール値)。
5.1と6.1の両方のシミュレータでこれをテストしました。これは、「オブジェクト」を要求することによって設定された整数またはブール値を実際にテストできないことを意味します。 「設定されていない」を「ゼロに設定されている」ように扱うことを気にしない場合は、整数でこれを回避できます。
これをすでにテストした人は、偽陰性の側面にだまされているようです。つまり、キーが設定されていないことがわかっているときにobjectForKeyがnilを返すかどうかを確認することでこれをテストしますが、キーが設定されていますが、NOに設定されています。
ここに送られた自分の問題については、ブール値のセマンティクスを変更したため、値がNOに設定されていることを希望のデフォルトと一致させました。それがオプションではない場合、ブール値以外の何かとして保存し、YES、NO、および「未設定」の違いを伝えることができることを確認する必要があります。
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
UserDefaults
を1回拡張して、このソリューションをコピーアンドペーストしないようにします。
extension UserDefaults {
func hasValue(forKey key: String) -> Bool {
return nil != object(forKey: key)
}
}
// Example
UserDefaults.standard.hasValue(forKey: "username")
Bool?
を取得するSwiftバージョン
NSUserDefaults.standardUserDefaults().objectForKey(DefaultsIsGiver) as? Bool
この小さなクランペットを試してください:
-(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];
}
}
すべてをオブジェクトとして扱います。私のために働くようです。
私はちょうどこれを経験しましたが、あなたの答えの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"]) {
...
これは私の場合はうまくいくようです。それは私にとってより視覚的に意味がありました。
Swift3では、このように使用しました
var hasAddedGeofencesAtleastOnce: Bool {
get {
return UserDefaults.standard.object(forKey: "hasAddedGeofencesAtleastOnce") != nil
}
}
answer は、複数回使用する場合に最適です。
私はそれが役立つことを願っています:)