如何使用Swift 3中的条件对数组进行排序

时间:2017-04-27 13:45:58

标签: swift nsarray nsdictionary

我的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]]的更好方法是什么?非常感谢帮助。

1 个答案:

答案 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
}