ios 检查 UserDefault 是否存在 - Swift

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25104700/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 01:40:58  来源:igfitidea点击:

Check if UserDefault exists - Swift

iosswiftnsuserdefaults

提问by Ryan

I'm trying to check if the a user default exists, seen below:

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

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

    if userDefaults.objectForKey(kUSERID) {
        return true
    }

    return false
}

However, no mater what it will always return true even when the object doesn't exist yet? Is this the right way for checking existence ?

但是,无论如何,即使对象尚不存在,它也会始终返回 true 吗?这是检查存在的正确方法吗?

回答by user7248923

Astun has a great answer. See below for the Swift 3 version.

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

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

回答by Astun

I copy/pasted your code but Xcode 6.1.1 was throwing some errors my way, it ended up looking like this and it works like a charm. Thanks!

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

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

回答by codester

Yes this is right way to check the optionalhave nilor any value objectForKeymethod returns AnyObject?which is Implicit optional.

是的,这是检查optionalhasnil或任何值objectForKey方法返回的正确方法AnyObject?,即Implicit optional.

So if userDefaults.objectForKey(kUSERID)have any value than it evaluates to true. if userDefaults.objectForKey(kUSERID)has nilvalue than it evaluates to false.

所以如果userDefaults.objectForKey(kUSERID)有任何价值比它评估为true. 如果userDefaults.objectForKey(kUSERID)nil值比它的计算结果false

From swift programming guide

来自 swift 编程指南

If Statements and Forced UnwrappingYou can use an if statement to find out whether an optional contains a value. If an optional does have a value, it evaluates to true; if it has no value at all, it evaluates to false.

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

Now there is a bug in simulators than after setting key in userDefaultsthey always remain set no matter you delete your app.You need to reset simulator.

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

Reset your Simulatorcheck this method before setting key in userDefaultsor remove key userDefaults.removeObjectForKey(kUSERID)from userDefaultsand it will return NO.On devices it is resolved in iOS8 beta4.

重置您的模拟器在设置密钥userDefaultsuserDefaults.removeObjectForKey(kUSERID)从中删除密钥之前检查此方法userDefaults,它将返回NO。在设备上,它在iOS8 beta4.

回答by Sir Codesalot

This is essentially the same as suggested in other answers but in a more convenient way (Swift 3+):

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

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

usage: if UserDefaults.contains(kUSERID) { ... }

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

回答by Sudhi 9135

Simple Code to check whether value stored in UserDefault.

检查值是否存储在 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")
}

回答by Johny D Good

for swift 3.2

快速 3.2

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

回答by Jamil Hasnine Tamim

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
        }
    }

}

Or you can try this library: Link

或者你可以试试这个库:链接

回答by Andrea Leganza

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

   return true;
}

回答by hamayun zeb

override func viewDidLoad() {

覆盖 func viewDidLoad() {

super.viewDidLoad()

super.viewDidLoad()

if UserDefaults.standard.string(forKey: "CHARRY") == "CHARRY"{

if 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")


}

回答by Xavier Lowmiller

Many of the solutions here are valid. Still, I think they solve the wrong problem.

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

Usually, code like this is used to check if a value is set so another default value can be used:

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

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

You shouldn't care if a key is set or not. There is a far more elegant approach for having default values in UserDefaults:

您不应该关心是否设置了密钥。有一种更优雅的方法来设置默认值UserDefaults

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

If you run this code at app launch, subsequent calls to UserDefaults.standard.string(forKey: "username")will return the default value of "No username was set"if no value was set for the key yet.

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