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!)已解决。谢谢奥利弗。
答案 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:)