尽管有条件绑定,但意外地发现nil却隐式展开了Optional值

时间:2019-04-09 23:19:22

标签: ios swift

所以我有以下几行:

    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()部分),使其可以正常工作而不会失败?

修改Check this showing the connection

2 个答案:

答案 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 letguard 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"