首页 文章

如何通过键对字典进行排序,其中值是Swift 4中的对象数组?

提问于
浏览
1

我有包含 String 键和 Objects 数组的字典作为值 . 使用 append 方法将这些值从已排序的对象数组添加到Dictionary中 . 根据对象属性的第一个字母将值分类为键 . 但是返回未排序的Dictionary .

字典被宣布:

var namesDic = [String: [Name]]()

var filteredNames = [String: [Name]]()

并遍历数组并追加到Dictionary中:

for name in names {
        let letterIndex = name.getName().index(name.getName().startIndex, offsetBy: 0)

        let letter = name.getName()[letterIndex]

        if namesDic[String(letter)] != nil {
            namesDic[String(letter)]?.append(name)
        } else {
            namesDic[String(letter)] = [name]
        }
    }
    filteredNames = namesDic

}

名称结构:

struct Name {
    var id: Int!
    var name: String!
    var native: String!
    var meaning: String!
    var origin: String!
    var isFavorite: Bool
    var gender: String!

    init(id: Int, name: String, native: String, meaning: String, origin: String, isFavorite: Int, gender: String) {
        self.id = id
        self.name = name
        self.native = native
        self.meaning = meaning
        self.origin = origin
        if isFavorite == 0 {
            self.isFavorite = false
        } else { self.isFavorite = true }
        self.gender = gender
    }
}

我在调试中发现,当它们被附加到字典时它们是未排序的 . 我理解Swift Dictionary上的排序不起作用,但我想要一个解决方法按键对Dictionary进行排序以将其传递给TableView .

我在这里经历了很多问题/答案,但它们都是 [String: String] 而不是 Array of Objects .

2 回答

  • 3
    struct Name: CustomStringConvertible {
        let id: Int
        let name: String
        let native: String
        let meaning: String
        let origin: String
        let isFavorite: Bool
        let gender: String
        var description: String {
            return "Id: " + String(id) + " - Name: " + name 
        }
    }
    
    let name1 = Name(id: 1, name: "Tim Cook", native: "native", meaning: "meaning", origin: "origin", isFavorite: true, gender: "Male")
    let name2 = Name(id: 2, name: "Steve Jobs", native: "native", meaning: "meaning", origin: "origin", isFavorite: true, gender: "Male")
    let name3 = Name(id: 3, name: "Tiger Woods", native: "native", meaning: "meaning", origin: "origin", isFavorite: true, gender: "Male")
    let name4 = Name(id: 4, name: "Socrates", native: "native", meaning: "meaning", origin: "origin", isFavorite: true, gender: "Male")
    
    let names = [name1, name2, name3, name4]
    
    
    let dictionary = names.sorted(by: {$0.name < $1.name }).reduce(into: [String: [Name]]()) { result, element in
        // make sure there is at least one letter in your string else return
        guard let first = element.name.first else { return }
        // create a string with that initial
        let initial = String(first)
        // initialize an array with one element or add another element to the existing value
        result[initial, default: []].append(element)
    }
    

    let sorted = dictionary.sorted {$0.key < $1.key}
    print(sorted)   // "[(key: "S", value: [Id: 4 - Name: Socrates, Id: 2 - Name: Steve Jobs]), (key: "T", value: [Id: 3 - Name: Tiger Woods, Id: 1 - Name: Tim Cook])]\n"
    
  • 1

    根据Apple的文档

    字典存储相同类型的键与集合中相同类型的值之间的关联,而没有定义的排序 . 每个值都与唯一键相关联,该唯一键充当字典中该值的标识符 . 与数组中的项目不同,字典中的项目没有指定的顺序 . 当您需要根据标识符查找值时,可以使用字典,这与使用真实字典查找特定单词的定义的方式非常相似 .

    更多信息请参见Apple's Website

    Workaround

    可以做的一件事是创建一个排序键数组,然后使用该数组访问字典值

相关问题