Swift - 即使在检查对象是否存在之后仍然打印 "Optional" - 我如何解包

Swift - Still printing "Optional" even after checking if object exists - how do I unwrap

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 Optional("dan")

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

print("on load (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 - Needed to unwrap the set (userName.text) like so > (userName.text!) SOLVED. Thanks Oliver.

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

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

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

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

object(forKey:) returns 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 }