检查UserDefault是否存在 - Swift

时间:2014-08-03 12:36:44

标签: ios swift nsuserdefaults

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

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

然而,即使对象不存在,它也总是会返回真实的东西吗?这是检查存在的正确方法吗?

9 个答案:

答案 0 :(得分:82)

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

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

答案 1 :(得分:28)

我复制/粘贴了你的代码,但Xcode 6.1.1却以我的方式抛出了一些错误,它看起来像这样,它就像一个魅力。谢谢!

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

答案 2 :(得分:21)

是的,这是检查optional nilobjectForKey方法返回AnyObject? Implicit optional的正确方法。

因此,如果userDefaults.objectForKey(kUSERID)具有任何值,则其值为true。如果userDefaults.objectForKey(kUSERID)的值为nil,则其值为false

来自swift编程guide

  

如果语句和强制解包   您可以使用if语句来确定可选项是否包含值。如果可选项具有值,则计算结果为   真正;如果它根本没有值,则评估为false。

现在模拟器中存在一个错误,而不是在userDefaults中设置密钥后,无论你删除你的应用程序,它们都会保持设置。你需要重置模拟器。

重置模拟器检查此方法,然后在userDefaults中设置密钥或从userDefaults.removeObjectForKey(kUSERID)中删除密钥userDefaults  它将返回NO。在设备上,它会在iOS8 beta4中解析。

答案 3 :(得分:4)

简单代码,用于检查是否存储在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")
}

答案 4 :(得分:2)

for swift 3.2

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

答案 5 :(得分: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
        }
    }

}

或者您可以尝试以下库:Link

答案 6 :(得分:0)

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

   return true;
}

答案 7 :(得分: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")


}

答案 8 :(得分: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"