如何处理Unwrap可选值

时间:2018-01-08 18:38:42

标签: ios swift optional-values

Console.WriteLine

因为我得到了我的答案的解决方案,如果你有超过1个值成为零消息[i] == nill或者可能是发件人可能是nill或displayname == nill所以为此我们必须使用或条件来检查indiviually

2 个答案:

答案 0 :(得分:1)

您应该注意清理格式。它很草率。此外,您应该使用if let有条件地解包并绑定可选内的值(如果存在):

if let displayName = messages[i].header.sender.displayName {
    snd = displayName
}
else {
    snd = "No Name"
}

更好的是,您可以使用the nil-coalescing operator (??)

let snd = messages[i].header.sender.displayName ?? "No Name"

回复您编辑过的问题。再一次,你的代码是一个完整的混乱。这段代码看起来好像你花钱打字。 msgssndsbj?真? messagessendersubject更难写吗?想一想代码的 reader 有多清晰和简单。如果没有修复它,只需看看在清理之后这段代码的可管理性是多少:

fetchOperation?.start { (error, messages, vanished) -> Void in
    let sender = "No Name"
    if messages != nil {
        let messages = msgs as! [MCOIMAPMessage]
        for i in 0..<messages.count {
            let dateString = messages[i].header.date.description
            let subject = messages[i].header.subject!
            print(subject)//HERE ITS GIVE ME SBJ THTS MEAN NO NIL IN IT NIL COMES  when i used for display name
            let sender = messages[i].header?.sender?.displayName? ?? "No Name"
            //its give fetal error unwrap optional value for "snd"
        }
    }
}

现在,我试图解决这个问题:

fetchOperation?.start { (error, messages, vanished) -> Void in
    guard let messages = messages as? [MCOIMAPMessage] else { return }
    for message in messages {
        let header = message.header

        //FIXME: .description is a bad idea. use dateformatter to internationalize.
        let dateString = header.date.description 
        let subject = header.subject
        print(subject)
        let senderDisplayName = header.sender.displayName ?? "No Name"
    }
}

答案 1 :(得分:1)

在这个长链中,我怀疑你有一个零

messages[i].header.sender.displayName

意思是,headersendermessages[i]可能为零。但是,通常编译器会对你大喊大叫,这样你最终会写出类似的内容:

messages?[i].header?.sender?.displayName == nil

或类似;取决于键链中有多少项是选项。

意思是,正确的链可能是

messages[i].header?.sender.displayName

messages[i].header.sender?.displayName

messages?[i].header?.sender.displayName

等。所有这些都取决于您的数据模型以及哪些项目被定义为选项。