Console.WriteLine
因为我得到了我的答案的解决方案,如果你有超过1个值成为零消息[i] == nill或者可能是发件人可能是nill或displayname == nill所以为此我们必须使用或条件来检查indiviually
答案 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"
回复您编辑过的问题。再一次,你的代码是一个完整的混乱。这段代码看起来好像你花钱打字。 msgs
? snd
? sbj
?真? messages
,sender
,subject
更难写吗?想一想代码的 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
意思是,header
或sender
或messages[i]
可能为零。但是,通常编译器会对你大喊大叫,这样你最终会写出类似的内容:
messages?[i].header?.sender?.displayName == nil
或类似;取决于键链中有多少项是选项。
意思是,正确的链可能是
messages[i].header?.sender.displayName
或
messages[i].header.sender?.displayName
或
messages?[i].header?.sender.displayName
等。所有这些都取决于您的数据模型以及哪些项目被定义为选项。