所以我有以下几行:
let theUsername = "\(String(describing: selectedPost?.user.username!))"
if selectedPost?.user.username! != nil {
print("Contains a value!")
username.text = theUsername//Fails here
} else {
print("Doesn’t contain a value.")
username.text = "No username found: Weird"
}
错误消息:
意外发现nil,同时隐式展开一个可选值
会让人们认为内部的值为零。但是在打印时:
print("\(String(describing: selectedPost?.user.username!))", " LIT555")
我得到:
可选(“ C22AE009-8CC6-490A-9328-23A08AAD3A10”)LIT555
如何将值转换为非可选值(即摆脱Optional()部分),使其可以正常工作而不会失败?
答案 0 :(得分:1)
尝试
if let res = selectedPost?.user.username { // to unwrap the optional value
// check textfield is not nil
username.text = res
}
else {
username.text = "default"
}
或者不久之后
username.text = selectedPost?.user.username ?? "default"
由于崩溃,您的文本字段为nil,请检查IB连接
执行此操作
var selectedPost : Post? { didSet { getMediaStats() loadP3Data() } }
并在前一个vc的selectedPost
方法中为prepare
分配一个值,由于尚未加载目标vc出口,并且由于didSet
在调用之前就立即被调用,因此目标vc出口仍然为nil。负载,因此崩溃
因此,删除didSet
并在viewDidLoad
中调用其中的内容
答案 1 :(得分:0)
即使您在!
使用username
,该表达式仍然是可选的,因为您在?
中有selectedPost
。我强烈建议您不要使用强制展开(!
),始终使用if let
或guard let
来确保可以展开可选的包装并避免崩溃。
这是您的代码的样子:
if let theUsername = selectedPost?.user.username {
username.text = theUsername
} else {
username.text = "No username found: Weird"
}
或
username.text = selectedPost?.user.username ?? "No username found: Weird"