1

对 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 标签,并且还会在控制台打印以下内容...

加载时可选(“丹”)

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

print("加载时 (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)                
   }        
}

回答 - 需要像这样解开集合 (userName.text) > (userName.text!) 已解决。谢谢奥利弗。

4

2 回答 2

0

我认为当您将 UID 设置为 UserDefaults 时,您使用与打印相同的方法设置字符串。但是,如果您此时不解开可选项,则该字符串将保存为“可选(丹)”。因此,您在上面的代码中正确解包,但字符串已经是“可选(Dan)”。

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

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

但是名称是可选的。打开名称,您的问题应该得到解决。

于 2016-10-09T20:49:55.913 回答
-1

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

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

或使用string(forKey:)类似的方法

guard let uidObject1 = UserDefaults.standard.string(forKey: "UID") else { return }
于 2016-10-09T21:08:38.560 回答