如何通过键对字典进行排序,其中值是Swift 4中的对象数组? [英] How to sort Dictionary by keys where values are array of objects in Swift 4?

查看:77
本文介绍了如何通过键对字典进行排序,其中值是Swift 4中的对象数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have Dictionary which contains String keys and Array of Objects as value. These values are added from the sorted Array of objects into Dictionary using append method. The values are categorized into keys based on the first letter of object property. But returns unsorted Dictionary.

字典被声明为:

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

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

遍历数组并追加到Dictionary中:

And iterating through array and appending into 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传递给TableView来解决.

I found in debugging that they are unsorted when they are appended to dictionary. I understand sort on Swift Dictionary is not working but I want a work around to sort Dictionary by key to pass it to TableView.

我在这里遇到了许多问题/答案,但都是针对[String: String]而不是对象数组.

I went through many questions/answers here but they are all for [String: String] not Array of Objects.

推荐答案

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"

这篇关于如何通过键对字典进行排序,其中值是Swift 4中的对象数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆