這是我的模型看起來像
struct ContactModel{
var alphabet: String
var users: [UserModel]
}
struct UserModel{
var firstname: String
var lastname: String
}
sort在這里使用按字母順序排序作業正常是代碼:
contactArray.sort{ $0.alphabet < $1.alphabet }
現在,我想在UserModel firstname
嘗試嵌套排序的基礎上對升序或降序進行排序,但給了我不同的錯誤,例如
Comparable and Binary operator '<' cannot be applied to two '[UserModel]' operands
我在 StackOverflow 上搜索了這個,但沒有找到嵌套排序和運算元錯誤解決方案。
我試過這種方式
let sortedStudents = contactArray.sorted { (lhs: ContactModel, rhs: ContactModel) -> Bool in
let users1 = lhs.users.sorted(by: {
$0.firstname.lowercased() < $1.firstname.lowercased()
})
let users2 = rhs.users.sorted(by: {
$0.firstname.lowercased() < $1.firstname.lowercased()
})
return users1 < users2
}
但它不作業。這里唯一的問題是我無法在這里進行嵌套排序,我想對 UserModel 的名字和 We have ContactModelArray進行排序
var contactArray = [ContactModel](){
didSet{
contactArray.sort{ $0.alphabet < $1.alphabet } //Simple Sort working fine.
let sortedStudents = contactArray.sorted { (lhs: ContactModel, rhs: ContactModel) -> Bool in
let users1 = lhs.users.sorted(by: {
$0.firstname.lowercased() < $1.firstname.lowercased()
})
let users2 = rhs.users.sorted(by: {
$0.firstname.lowercased() < $1.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

任何建議表示贊賞。謝謝!
uj5u.com熱心網友回復:
下面的代碼ContactModel首先根據字母表對陣列進行排序。然后,它將這個排序的陣列映射到一個新陣列,該UserModel陣列也被排序。
contactArray.sort { $0.alphabet < $1.alphabet }
let fullySorted = contactArray.map( { ContactModel(alphabet: $0.alphabet, users: $0.users.sorted { $0.firstname < $1.firstname }) } )
的map和sort功能也可以交換,即,第一映射到一個新的陣列,然后分選基于字母表。原始陣列:
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")
])
]
如果還有另一個ContactModelwith alphabet = "A",那么這將是contactArray.
如果您真的需要,您甚至可以將其縮減為一行代碼。但是,我不會推薦它,因為排序和映射對于不熟悉它的人來說很難閱讀。
// Single line of code solution (I wouldn't recommend this because of readability)
let fullySorted = contactArray.sorted { $0.alphabet < $1.alphabet }.map( { ContactModel(alphabet: $0.alphabet, users: $0.users.sorted { $0.firstname < $1.firstname }) } )
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/394589.html
下一篇:從集合中獲取隨機元素
