How to handle an Unwrap optional value

203 Views Asked by At
    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
                }

since i got solution of my answer if you have more then 1 values who become nil messages[i] == nill or may be sender could be nill or displayname == nill so for this we have to use or condition to check indiviually

2

There are 2 best solutions below

1
On

You should really take some care into cleaning up your formatting. It's sloppy. Also, you should use if let to conditionally unwrap and bind the value inside an optional, if it exists`:

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

Even better, you can use the nil-coalescing operator (??):

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

In response to your edited question. Again, you're code is a complete mess. This code makes it look like it costs you money to type letters. msgs? snd? sbj? Really? Is messages, sender, subject that much harder to write? Think of how much cleaner and easier they are for the readers of your code. Without even fixing it yet, just look at how much more manageable this code is after some clean-up:

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"
        }
    }
}

Now, here's my attempt at fixing it up:

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"
    }
}
3
On

In this long chain, I suspect that you have a nil

messages[i].header.sender.displayName

Meaning, perhaps header or sender or even messages[i] is nil. However, normally the compiler will yell at you so that you wind up writing something that looks like:

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

or similar; depending on how many of the items in the chain of keys are optionals.

Meaning, the correct chain might be

messages[i].header?.sender.displayName

or

messages[i].header.sender?.displayName

or

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

etc. All depending on your data model and which of those items are defined as optionals.