我的Array
CNContact
。我需要按名称对它们进行排序,以便按名称排序tableView
个部分。
var sortedContactsDictionary: [String: [CNContact]] = [:]
var alphabeticSortedContacts: [CNContact] = []
func setAlphabeticOrderOfContacts(_ contact: CNContact) {
var name = ""
if contact.familyName != "" {
name = contact.familyName.lowercaseFirst
} else {
name = contact.givenName.lowercaseFirst
}
let currentLetter = name.characters.first
if self.lastProcessedLetter == nil || self.lastProcessedLetter == currentLetter {
self.alphabeticSortedContacts.append(contact)
} else {
self.alphabeticSortedContacts.removeAll()
self.alphabeticSortedContacts.append(contact)
}
self.lastProcessedLetter = currentLetter
if let letter = currentLetter {
self.sortedContactsDictionary["\(letter)"] = self.alphabeticSortedContacts
}
}
但我的问题是,某些familyName
值包含特殊字符,例如(
作为第一个字符。
由于[CNContact]
已经排序,特殊字符名称会在我不需要的地方排序,如果我这样做的话:
let specialCharactersRemoved = name.replacingOccurrences(of: "(", with: "")
let currentLetter = specialCharactersRemoved.characters.first
我的部分不再有序了。我有名字的“第二个字母”(在(
之后),例如作为部分的第一个字母而不是所需的A
,如果我再次对字典进行排序,我有多次使用(fe)键S
。
我错过了什么或将[CNContact]
排序为[String: [CNContact]]
的更好方法是什么?非常感谢帮助。
答案 0 :(得分:0)
我已经重新编写了我的函数,现在我附加了现有的密钥并在缺少的密钥上创建了一个新的数组。
func setAlphabeticOrderOfContacts(_ contact: CNContact) {
if let letter = self.getCurrentLetter(contact) {
let keyExists = self.sortedContactsDictionary["\(letter)"] != nil
if keyExists {
var arrayOfContacts = self.sortedContactsDictionary["\(letter)"]
arrayOfContacts?.append(contact)
self.sortedContactsDictionary["\(letter)"] = arrayOfContacts
} else {
var arrayOfContacts = [CNContact]()
arrayOfContacts.append(contact)
self.sortedContactsDictionary["\(letter)"] = arrayOfContacts
}
}
}
func getCurrentLetter(_ contact: CNContact) -> Character? {
var name = String()
if contact.familyName != "" {
name = contact.familyName
} else {
name = contact.givenName
}
let specialCharactersRemoved = name.replacingOccurrences(of: "(", with: "").lowercaseFirst
let currentLetter = specialCharactersRemoved.characters.first
guard let letter = currentLetter else { return nil }
return letter
}