如何根据 Swift 中的条件对数组进行排序 3
How to sort an Array with conditions in Swift 3
我有 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
我的部分不再按顺序排列。例如,我有名称的 "second letter"(在 (
之后)作为部分的第一个字母,而不是所需的 A
,如果我再次对字典进行排序,我有多个部分使用 (f.e.) 键 S
。
我遗漏了什么或者将 [CNContact]
分类为 [String: [CNContact]]
的更好方法是什么?非常感谢帮助。
我重新编码了我的函数,现在我附加到现有的键上,并在缺少的键上创建一个新数组。
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
}
我有 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
我的部分不再按顺序排列。例如,我有名称的 "second letter"(在 (
之后)作为部分的第一个字母,而不是所需的 A
,如果我再次对字典进行排序,我有多个部分使用 (f.e.) 键 S
。
我遗漏了什么或者将 [CNContact]
分类为 [String: [CNContact]]
的更好方法是什么?非常感谢帮助。
我重新编码了我的函数,现在我附加到现有的键上,并在缺少的键上创建一个新数组。
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
}