检查UserDefault是否存在-Swift


87

我正在尝试检查是否存在用户默认值,如下所示:

func userAlreadyExist() -> Bool {
    var userDefaults : NSUserDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

但是,无论对象还不存在,它总是会返回true吗?这是检查存在的正确方法吗?

Answers:


127

阿斯通有一个很好的答案。请参阅下面的Swift 3版本。

func isKeyPresentInUserDefaults(key: String) -> Bool {
    return UserDefaults.standard.object(forKey: key) != nil
}

29

我复制/粘贴了您的代码,但是Xcode 6.1.1以我的方式抛出了一些错误,它最终看起来像这样,并且像一个魅力一样工作。谢谢!

func userAlreadyExist(kUsernameKey: String) -> Bool {
    return NSUserDefaults.standardUserDefaults().objectForKey(kUsernameKey) != nil
}

工作了!但是你忘了参数,所以我加入进去。
杰西Onolemen

21

是的,这是检查的正确方法optionalnil或任意数值objectForKey方法的返回值AnyObject?Implicit optional

因此,如果userDefaults.objectForKey(kUSERID)它的值大于等于的值true。如果userDefaults.objectForKey(kUSERID)nil值比它的计算结果false

从快速编程指南

If语句和强制展开 您可以使用if语句来查找可选变量是否包含值。如果可选参数确实具有值,则其值为true;否则为false。如果它根本没有任何值,则其结果为false。

现在,模拟器中存在一个错误,而不是在设置密钥后userDefaults始终保持设置状态,无论您删除应用程序都需要重置模拟器。

重置您的模拟器中设定键前检查这个方法userDefaults或删除键userDefaults.removeObjectForKey(kUSERID)userDefaults 它将返回NO。对设备它解决iOS8 beta4


objectForKey方法返回的AnyObject!是隐可选”这是错误的,它返回AnyObject?
狮子座Dabus

1
@LeoDabus Swift已经改变了很多次。谢谢顺便说一句,我已经改变了。
codester

自2016年10月25日起,文档中的行现在显示“您可以使用if语句,通过将可选值与nil进行比较来找出可选值是否包含值。您可以使用“等于”运算符(= =)或“不等于”运算符(!=)。如果尝试这样做if anOptional { },Xcode 7.3.1将显示编译错误,并建议您使用== nil或!= nil进行测试
wyu

14

这基本上与其他答案中的建议相同,但以更方便的方式(Swift 3+):

extension UserDefaults {
    static func contains(_ key: String) -> Bool {
        return UserDefaults.standard.object(forKey: key) != nil
    }
}

用法: if UserDefaults.contains(kUSERID) { ... }


然后使函数静态是有意义的,因为您正在访问单例标准static func contains(key: String) -> Bool。否则,更有意义return self.object(forKey: key) != nil
Nomad Developer

5

简单代码,用于检查值是否存储在UserDefault中。

let userdefaults = UserDefaults.standard
if let savedValue = userdefaults.string(forKey: "key"){
   print("Here you will get saved value")       
} else {
   print("No value in Userdefault,Either you can save value here or perform other operation")
   userdefaults.set("Here you can save value", forKey: "key")
}


0
public class PreferencesUtils {

    private init() {

    }

    public static func setBoolData(boolValue: Bool, dataName: String) {
        UserDefaults.standard.set(boolValue, forKey: dataName)
    }

    public static func getBoolData(dataName: String)-> Bool{

        let defaults = UserDefaults.standard

        if(defaults.value(forKey: dataName) != nil) {
            return defaults.value(forKey: dataName)! as! Bool

        } else {
            return false
        }
    }

    public static func saveStringData(data: String, dataName: String){
        let preferences = UserDefaults.standard
        preferences.set(data, forKey: dataName)
        let didSave = preferences.synchronize()
        if !didSave {
            debugPrint("Not saved yet")
        }
    }

    public static func getSavedStringData(dataName: String)-> String{
        let defaults = UserDefaults.standard
        if(defaults.value(forKey: dataName) != nil){
            return defaults.value(forKey: dataName) as! String
        } else {
            return ""
        }
    }

    public static func saveIntData(data : Int, dataName: String){
        let preferences = UserDefaults.standard
        preferences.set(data, forKey: dataName)
        let didSave = preferences.synchronize()
        if !didSave {
            debugPrint("Not saved yet")
        }
    }

    public static func getSavedIntData(dataName: String) -> Int {
        let defaults = UserDefaults.standard
        if(defaults.value(forKey: dataName) != nil){
            return defaults.value(forKey: dataName) as! Int
        }else{
            return 0
        }
    }

}

或者您可以尝试以下库:链接


0
func keyExists(key: String) -> Bool {
    guard let _ = UserDefaults.standard.object(forKey: key) {
     return false;
    }

   return true;
}

请不要仅将代码发布为答案,还应提供解释,说明代码的作用以及如何回答问题。带有解释的答案通常更有用,而且质量更高,并且更有可能吸引投票。
Mark Rotteveel

0

覆盖func viewDidLoad(){

super.viewDidLoad()

如果UserDefaults.standard.string(forKey:“ CHARRY”)==“ CHARRY” {

 lb.text = "CHARRY"

 im.image = UIImage(named: "CHARRY")

}}

@IBAction func PressedCar(_ sender: UIButton){

 lb.text = "CHARRY"

 im.image = UIImage(named: "CHARRY")

 UserDefaults.standard.set("CAR", forKey: "CHARRY")


}

0

这里的许多解决方案都是有效的。不过,我认为他们解决了错误的问题。

通常,这样的代码用于检查是否设置了值,因此可以使用另一个默认值:

if isKeyPresentInUserDefaults(key: "username") {
    return UserDefaults.standard.string(forKey: "username")
} else {
    return "No username was set"
}

您不必关心是否设置了密钥。有一个更优雅的方法可以在中使用默认值UserDefaults

UserDefault.standard.register(defaults: ["username": "No username was set"])

如果您在应用启动时运行此代码,则对的后续调用UserDefaults.standard.string(forKey: "username")将返回默认值,"No username was set"如果尚未为密钥设置任何值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.