NSUserDefaults – 如何判断一个密钥是否存在

我正在研究一个小型的iPhone应用程序,并且使用NSUserDefaults作为我的数据持久性。 它只需要跟踪一些东西,比如一些名字和一些数字,所以我想我可以保持简单。

我发现这个网页有一些参考,但我不认为它可以回答我的问题。 基本上,我希望能够检查一个值(或一个键)是否已经存在于NSUserDefaults,然后做相应的事情。

一些例子:应用程序启动,如果这是第一次启动它输出一个警告说欢迎。 要知道这是否是第一次打开它读取UserDefaults并检查。

例2:它说,“你好[名字]”,其中名称是你input的东西。 如果你已经打开了应用程序,并没有名字,应该说“Hello World”。 我需要检查你是否已经input一个名称,并采取相应的行动。 该名称将被存储在NSUserDefaults中。

一些帮助在这里? 我真的很感激它!

objectForKey:如果不存在则返回nil

如上所述,它不适用于0 / NO可能是有效值的原始types。 我正在使用这个代码。

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

如果值不存在, objectForKey:方法将返回nil 。 这是一个简单的IF / THENtesting,它会告诉你该值是否为零:

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

如果objectForKey不存在 ,它将返回nil。如果它存在,它将返回nil,它是一个整数或一个值为零的布尔值(即布尔值为FALSE或NO)。

我已经在5.1和6.1的模拟器中testing过了。 这意味着你不能真正的testing要求“对象”设置的整数或布尔值。 如果您不介意将“未设置”设置为“设置为零”,则可以使用整数。

已经testing过的人似乎被假阴性方面所愚弄,即通过查看objectForKey是否返回nil来testing这一点,当你知道键没有被设置,但是没有注意到,如果键已经被返回,它也返回nil设置但已被设置为NO。

对于我自己的问题,在这里发送给我,我只是最终改变了我的布尔的语义,以便我所需的默认值与值设置为否一致。 如果这不是一个选项,则需要将其存储为布尔值以外的内容,并确保可以区分YES,NO和“未设置”。

尝试这个小小的cookies:

 -(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]; } } 

把一切当作一个物体。 似乎为我工作。

我刚刚经历了这个, 所有的答案都帮助我find了一个很好的解决scheme。 我拒绝按照所提出的路线走,因为我发现很难阅读和理解。

这是我做的。 我有一个BOOL被一个名为“_talkative”的variables带着。

当我设置我的默认(NSUserDefaults)对象,我把它设置为一个对象,因为我可以然后testing,看看它是否为零:

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

然后当我去看看它是否存在,我用:

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

然后我用这个对象作为BOOL:

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

这似乎在我的情况。 这对我来说更具视觉感。

Swift版本得到Bool?

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

扩展UserDefaults一次不复制粘贴此解决scheme:

 extension UserDefaults { func hasValue(forKey key: String) -> Bool { return nil != object(forKey: key) } } // Example UserDefaults.standard.hasValue(forKey: "username") 

Swift 3:

为什么int / double / float / bool不能以与String相同的方式(如果key不存在则返回nil,否则返回存储的string值)作为可选项来处理。

所以下面是四种核心types的简单扩展,它们模拟了通过UserDefaults进行交互的其他types的行为。

 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? { guard self.object(forKey: forKey) != nil else { return nil } return self.integer(forKey: forKey) } /// 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? { guard self.object(forKey: forKey) != nil else { return nil } return self.double(forKey: forKey) } /// 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? { guard self.object(forKey: forKey) != nil else { return nil } return self.float(forKey: forKey) } /// 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? { guard self.object(forKey: forKey) != nil else { return nil } return self.bool(forKey: forKey) } } 

现在它们与其他内置的get方法(string,数据等)一起更加一致。 只需使用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 

在Swift3中,我用这种方式

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

如果你要多次使用, 答案是很好的。

我希望它有助于:)

Swift 3.0

 if NSUserDefaults.standardUserDefaults().dictionaryRepresentation().contains({ $0.0 == "Your_Comparison_Key" }){ result = NSUserDefaults.standardUserDefaults().objectForKey(self.ticketDetail.ticket_id) as! String }