-1
    if messages[i].header == nil || messages[i].header.sender == nil || messages[i].header.sender.displayName == nil{
                snd = "No Name"
                }
                else
                { snd =  messages[i].header.sender.displayName
                }

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

4

2 回答 2

1

你真的应该小心清理你的格式。这是马虎。此外,如果存在,您应该使用if let有条件地解包和绑定可选值中的值:

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

更好的是,您可以使用nil-coalescing 运算符 ( ??)

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

回应您编辑的问题。同样,您的代码完全是一团糟。此代码使您看起来像是要花钱输入字母。msgs? snd? sbj? 真的吗?messages, sender,subject有那么难写吗?想想它们对你的代码的读者来说是多么的干净和容易。甚至还没有修复它,只需看看这段代码在经过一些清理后更易于管理:

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"
    }
}
于 2018-01-08T18:54:57.390 回答
1

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

messages[i].header.sender.displayName

意义,也许headersender什至messages[i]是零。然而,通常编译器会对你大喊大叫,这样你最终会写出如下所示的内容:

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

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

意思是,正确的链可能是

messages[i].header?.sender.displayName

或者

messages[i].header.sender?.displayName

或者

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

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

于 2018-01-08T19:27:21.360 回答