检查 UserDefault 是不是存在 - Swift

Posted

技术标签:

【中文标题】检查 UserDefault 是不是存在 - Swift【英文标题】:Check if UserDefault exists - Swift检查 UserDefault 是否存在 - Swift 【发布时间】:2014-08-03 12:36:43 【问题描述】:

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

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

    if userDefaults.objectForKey(kUSERID) 
        return true
    

    return false

但是,不管什么,即使对象还不存在,它也总是返回 true?这是检查存在的正确方法吗?

【问题讨论】:

【参考方案1】:

阿斯顿有一个很好的答案。 Swift 3 版本见下文。

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

【讨论】:

【参考方案2】:

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

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

斯威夫特 5:

if UserDefaults.standard.object(forKey: "keyName") != nil 
  //Key exists

【讨论】:

成功了!但是你忘记了参数所以我添加了它。【参考方案3】:

是的,这是检查optional 是否有nil 或任何值objectForKey 方法返回AnyObject?Implicit optional 的正确方法。

所以如果userDefaults.objectForKey(kUSERID) 有任何值而不是它评估为true。如果userDefaults.objectForKey(kUSERID) 具有nil 值,则其计算结果为false

来自快速编程guide

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

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

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

【讨论】:

" objectForKey 方法返回 AnyObject! 这是隐式可选 " 这是错误的它返回 AnyObject? @LeoDabus Swift 已经改变了很多次。谢谢顺便说一句,我已经改变了。 截至 2016 年 10 月 25 日,文档中的行现在说“您可以使用 if 语句通过将可选项与 nil 进行比较来确定可选项是否包含值。您可以使用“等于”运算符 (==) 或“不等于”运算符 (!=)。”如果您尝试if anOptional ,Xcode 7.3.1 将显示编译错误,它会建议您使用 == nil 或 != nil 进行测试【参考方案4】:

这与其他答案中的建议基本相同,但方式更方便(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 更有意义【参考方案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")

【讨论】:

【参考方案6】:

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

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

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"(如果尚未为该键设置值)。

【讨论】:

另外,请注意:“注册域的内容不会写入磁盘;您需要在每次应用程序启动时调用此方法。”【参考方案7】:

对于 Swift 3.2

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

【讨论】:

【参考方案8】:
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

【讨论】:

【参考方案9】:
func keyExists(key: String) -> Bool 
    guard let _ = UserDefaults.standard.object(forKey: key) 
     return false;
    

   return true;

【讨论】:

请不要只发布代码作为答案,还要解释您的代码的作用以及它如何回答问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。【参考方案10】:

覆盖函数 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")



【讨论】:

以上是关于检查 UserDefault 是不是存在 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

appium初学者,使用之检查appium环境报错Could not detect Mac OS X Version from sw_vers output: '10.12.1’,

删除 UserDefault 中的套件

cocos2dx中的游戏储存-UserDefault

Cocos2d-x v3.3中UserDefault保存的XML文件位置

Cocos2d-x v3.3中UserDefault保存的XML文件位置

使用 UserDefault 快速存储和检索数组数据