斯威夫特 - 仍在打印"可选"甚至在检查对象是否存在之后 - 我该如何解包

时间:2016-10-09 20:37:42

标签: swift object optional userdefaults

Swift非常新,所以这是一个非常简单的问题,但我正在努力从UserDefaults存储的值中解包一个可选项。 UID的值是" dan"。这是代码:

override func viewDidLoad() {
    super.viewDidLoad()

    let uidObject1 = UserDefaults.standard.object(forKey: "UID")   

    if let uid = uidObject1 {
          updateUsername.setTitle("\(uid)", for: UIControlState.normal)
          print("on load \(uid)")
    }
}

这会更改按钮updateUsername标签,并且还会向控制台输出以下内容......

  

on load可选(" dan")

我无法摆脱Optional()。我试图打开uid。

  

打印("加载时(uid!)")

因为Xcode告诉我,我无法强制解开非可选类型' Any'的值。

从搜索中我了解到检查 - if let uid = uidObject1 - 删除了Optional(),因为它仅在uidObject1存在时运行。有人能指出我正确的方向吗?

编辑: 这是我的设定代码;

@IBAction func updateUsername(_ sender: AnyObject) {                         
   if let uid = userName.text {                        
      UserDefaults.standard.set("\(userName.text)", forKey: "UID")                  
      updateUsername.setTitle("\(uid)", for: UIControlState.normal)                
   }        
}
  

ANSWER - 需要像这样打开set(userName.text)> (userName.text!)已解决。谢谢奥利弗。

2 个答案:

答案 0 :(得分:0)

我认为当您将UID设置为UserDefaults时,您可以使用您用于打印的相同方法设置字符串。但是,如果您在此时未打开可选项,则该字符串将保存为"可选(Dan)"。因此,您正在正确地展开上面的代码,但字符串已经是"可选(Dan)"。

例如,设置UID值的代码可能如下所示

UserDefaults.standard.setValue("\(name)", forKey: "UID")

但名字是可选的。解包名称和问题应该修复。

答案 1 :(得分:-1)

object(forKey:)返回Any?类型的值。分配UID时,您应该将其转换为您想要的类型:

guard let uidObject1 = UserDefaults.standard.object(forKey: "UID") as? String else { return }

或使用{/ 1}}方法,如

string(forKey:)