Swift 5 中结构数组的嵌套排序

Nested Sort in Struct Array in Swift 5

这是我的模型

struct ContactModel{
    var alphabet: String
    var users: [UserModel]
}

struct UserModel{
    var firstname: String
    var lastname: String
}

使用 sort 按字母顺序排序在这里工作正常是代码:

contactArray.sort{ [=12=].alphabet < .alphabet }

现在,我想根据 UserModel firstname 进行升序或降序排序 我尝试嵌套排序,但给了我不同的错误,比如

Comparable and Binary operator '<' cannot be applied to two '[UserModel]' operands

我在 Whosebug 上搜索了这方面的内容,但没有找到嵌套排序和操作数错误的解决方案。

我这样试过

let sortedStudents = contactArray.sorted { (lhs: ContactModel, rhs: ContactModel) -> Bool in
                let users1 = lhs.users.sorted(by: {
                    [=14=].firstname.lowercased() < .firstname.lowercased()
                })
                let users2 = rhs.users.sorted(by: {
                    [=14=].firstname.lowercased() < .firstname.lowercased()
                })
                
                return users1 < users2
            }

但是它不起作用。我无法在这里进行嵌套排序的唯一问题是对 UserModel 的名字进行排序,我们有 ContactModel Array

var contactArray = [ContactModel](){
        didSet{
            
            contactArray.sort{ [=15=].alphabet < .alphabet } //Simple Sort working fine.
            
            let sortedStudents = contactArray.sorted { (lhs: ContactModel, rhs: ContactModel) -> Bool in
                let users1 = lhs.users.sorted(by: {
                    [=15=].firstname.lowercased() < .firstname.lowercased()
                })
                let users2 = rhs.users.sorted(by: {
                    [=15=].firstname.lowercased() < .firstname.lowercased()
                })
                
                return users1 < users2
            }
            
            self.tableView.reloadData()
        }
    }

数组包含这个

 func getAllContacts() -> [ContactModel]{
        return [
            ContactModel(alphabet: "B", users: [
                UserModel(firstname: "Bhaswar", lastname: "Patel"),
                UserModel(firstname: "Bunty", lastname: "Patel")
            ]),
            ContactModel(alphabet: "N", users: [
                UserModel(firstname: "Nilesh", lastname: "Darji")
            ]),
            ContactModel(alphabet: "Y", users: [
                UserModel(firstname: "Yogesh", lastname: "Patel"),
                UserModel(firstname: "Yash", lastname: "Patel")
            ])
        ]
    }

结果:

字母部分排序工作正常需要现在使用名字对用户进行排序 Yash 先出现然后 Yogesh

任何建议表示赞赏。谢谢!

下面的代码首先根据字母表对 ContactModel 数组进行排序。然后,它将这个排序的数组映射到一个新数组,其中 UserModel 数组也被排序。

contactArray.sort { [=10=].alphabet < .alphabet }
let fullySorted = contactArray.map( { ContactModel(alphabet: [=10=].alphabet, users: [=10=].users.sorted { [=10=].firstname < .firstname }) } )

mapsort函数也可以互换,即首先映射到一个新数组,然后根据字母表排序。 原数组:

var contactArray = [
    ContactModel(alphabet: "B", users: [
        UserModel(firstname: "Bhaswar", lastname: "Patel"),
        UserModel(firstname: "Bunty", lastname: "Patel")
    ]),
    ContactModel(alphabet: "N", users: [
        UserModel(firstname: "Nilesh", lastname: "Darji")
    ]),
    ContactModel(alphabet: "Y", users: [
        UserModel(firstname: "Yogesh", lastname: "Patel"),
        UserModel(firstname: "Yash", lastname: "Patel")
    ])
]

将变为(Yash 和 Yogesh 现在按字母顺序排列):

var contactArray = [
    ContactModel(alphabet: "B", users: [
        UserModel(firstname: "Bhaswar", lastname: "Patel"),
        UserModel(firstname: "Bunty", lastname: "Patel")
    ]),
    ContactModel(alphabet: "N", users: [
        UserModel(firstname: "Nilesh", lastname: "Darji")
    ]),
    ContactModel(alphabet: "Y", users: [
        UserModel(firstname: "Yash", lastname: "Patel"),
        UserModel(firstname: "Yogesh", lastname: "Patel")
    ])
]

如果还有另一个 ContactModelalphabet = "A",那么这将是 contactArray 中的第一个。

如果您确实需要,您可以甚至将其减少到一行代码。但是,我不推荐它,因为对于不熟悉它的人来说,排序和映射会变得难以阅读。

// Single line of code solution (I wouldn't recommend this because of readability)
let fullySorted = contactArray.sorted { [=13=].alphabet < .alphabet }.map( { ContactModel(alphabet: [=13=].alphabet, users: [=13=].users.sorted { [=13=].firstname < .firstname }) } )