UserDefaults检查nil值是否有效

时间:2017-08-18 09:55:40

标签: swift if-statement nsuserdefaults swift4

知道为什么我的if语句总能给出其他答案吗? 我从打印中注意到对象存储为" optional()",也许这个可选状态与nil不同?

class ViewController: UIViewController {

    @IBOutlet weak var phoneLabel: UITextField!
    @IBOutlet weak var phoneDisplayLabel: UILabel!

    @IBAction func storeButton(_ sender: Any) {
        UserDefaults.standard.removeObject(forKey: "Nb")
        UserDefaults.standard.set("\(phoneLabel.text!)", forKey: "Nb")
        print(UserDefaults.standard.object(forKey: "Nb") as Any)
    }

    @IBAction func retrieveButton(_ sender: Any) {
        let phoneNB = UserDefaults.standard.value(forKey: "Nb")
        if let phoneNbDisplay = phoneNB as? String {
            if UserDefaults.standard.object(forKey: "Nb") != nil {
                phoneDisplayLabel.text = "Your NB is \(phoneNbDisplay)"
            }
            else {
                phoneDisplayLabel.text = "enter a number first"
            }
        }
    }
}

4 个答案:

答案 0 :(得分:2)

推荐的方法(Apple!)是在UserDefaults中注册键/值对,以提供 - 如类名所暗示的 - 默认值。在第一次更改值之前,将考虑这些默认值。

Swift的好处是总有一个(非可选)值可以安全地解开。

尽快(例如applicationWillFinishLaunching)添加这些行。它们应该在每次应用程序启动时执行。键Nb使用空字符串默认值注册。

let defaultValues = ["Nb" : ""]
UserDefaults.standard.register(defaults: defaultValues)

storeButton 中不要删除密钥,也不要对String使用字符串插值,但请检查文本属性是否为nil并保存在这种情况下是一个空字符串。打印线是荒谬的,因为在写完之后从UserDefaults读取将不会得到更改,而您知道已写入的内容

@IBAction func storeButton(_ sender: Any) {
    UserDefaults.standard.set(phoneLabel.text ?? "", forKey: "Nb")
}

retrieveButton中使用专用方法string(forKey获取字符串,解包(由于注册密钥总是有值)并且只检查空字符串。并且不要读取(相同)值3次。

@IBAction func retrieveButton(_ sender: Any) {

    let phoneNbDisplay = UserDefaults.standard.string(forKey: "Nb")!
    if phoneNbDisplay.isEmpty {
        phoneDisplayLabel.text = "enter a number first"
    } else {
        phoneDisplayLabel.text = "Your NB is \(phoneNbDisplay)"
    }
}

答案 1 :(得分:1)

试试这个

if (UserDefaults.standard.value(forKey: "etc") != nil)
{
    if (UserDefaults.standard.value(forKey: "etc") as! String).character.count == 0
    {
        //value is ""
    }else{
        //having some value
    }
}

enter image description here

答案 2 :(得分:1)

正如vadian所评论的那样,在这种情况下,您不应该也不需要使用KVC方法value(forKey:)

试试这个:

@IBAction func storeButton(_ sender: Any) {
    UserDefaults.standard.removeObject(forKey: "Nb")
    UserDefaults.standard.set(phoneLabel.text ?? "", forKey: "Nb") //<-You have no need to use String Interpolation.
    print (UserDefaults.standard.object(forKey: "Nb") as Any)
}

@IBAction func retrieveButton(_ sender: Any) {
    if let phoneNB = UserDefaults.standard.string(forKey: "Nb") {
        if !phoneNB.isEmpty {
            phoneDisplayLabel.text = "Your NB is \(phoneNB)"
        } else {
            phoneDisplayLabel.text = "enter a number first"
        }
    } else {
        //### What do you want to do if "Nb" is not set?
    }
}

答案 3 :(得分:-1)

您可能忘记在存储值时调用同步。您可以尝试此操作。

Model.validate_unique()