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 }
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 }