如何根据 Swift 中的条件对数组进行排序 3

How to sort an Array with conditions in Swift 3

我有 ArrayCNContact。我需要它们按名称排序以使 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
}