字典有可选键
Dictionary has optional key
我有一个 CNContact
的数组,我用这个函数对它们进行排序:
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()
其中 contactDictionary 的类型为:
var contactDictionary: [String: [CNContact]] = [String: [CNContact]]()
var keys: [String] = []
现在,当我看到 contactDictionary 已填满时,它可以正常工作,但键总是 Optional(\"T"\")
或当然是其他字母。但为什么它是可选的? forloop中的key不是可选的,这是怎么来的?
尝试这样做:
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()
first
属性 of Collection
是可选类型,所以你可能在这里 contactName.characters.first
获得可选类型,如果你使用 if let
或者guard
将解决您的问题。
if let fc = name.characters.first {
let key = String(fc).uppercaseString
}
我有一个 CNContact
的数组,我用这个函数对它们进行排序:
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()
其中 contactDictionary 的类型为:
var contactDictionary: [String: [CNContact]] = [String: [CNContact]]()
var keys: [String] = []
现在,当我看到 contactDictionary 已填满时,它可以正常工作,但键总是 Optional(\"T"\")
或当然是其他字母。但为什么它是可选的? forloop中的key不是可选的,这是怎么来的?
尝试这样做:
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()
first
属性 of Collection
是可选类型,所以你可能在这里 contactName.characters.first
获得可选类型,如果你使用 if let
或者guard
将解决您的问题。
if let fc = name.characters.first {
let key = String(fc).uppercaseString
}