user1007522
user1007522

Reputation: 8118

Dictionary has optional key

I'm having a array of CNContact and I sort them with this function:

for contact in self.contacts {

   var contactName = contact.organizationName

    let key: String = String(contactName.characters.first).uppercaseString
    if let arrayForLetter = self.contactDictionary[key] {
        self.contactDictionary[key]!.append(contact)
        self.contactDictionary.updateValue(arrayForLetter, forKey: key)
    } else {
        self.contactDictionary.updateValue([contact], forKey: key)
    }
}

self.keys = self.contactDictionary.keys.sort()

Where contactDictionary is of type:

var contactDictionary: [String: [CNContact]] = [String: [CNContact]]()
var keys: [String] = []

Now when I see the contactDictionary when it's filled it works except the key always Optional(\"T"\") or some other letter of course. But why is it optional? The key in the forloop is not optional so how does this come?

Upvotes: 0

Views: 107

Answers (2)

Nirav D
Nirav D

Reputation: 72460

first property of Collection is of optional type, So you are getting optional probably here contactName.characters.first, if you wrapped it using if let or guard will solved your issue.

if let fc = name.characters.first {
    let key = String(fc).uppercaseString
}

Upvotes: 1

Vladyslav Zavalykhatko
Vladyslav Zavalykhatko

Reputation: 17414

Try to do it this way:

for contact in self.contacts {
   var contactName = contact.organizationName

    if let key = String(contactName.characters.first).uppercaseString {
        if let arrayForLetter = self.contactDictionary[key] {
            self.contactDictionary[key]!.append(contact)
            self.contactDictionary.updateValue(arrayForLetter, forKey: key)
        } else {
            self.contactDictionary.updateValue([contact], forKey: key)
        }
    }
}

self.keys = self.contactDictionary.keys.sort()

Upvotes: 0

Related Questions