我正在努力在 SwiftUI 中對陣列進行排序。我正在使用索引遍歷我的陣列,ForEach我想對整個陣列進行排序。我有不能Hashable因為CGSize價值的物件,這就是為什么我不能使用enumerated(). 經過幾個小時的嘗試,我仍然不知道如何實作排序陣列。
這是物件的代碼:
struct Object: Identifiable {
var id = UUID()
var position: CGPoint = .zero
var num: Int
}
和內容視圖:
struct ContentView: View {
@State var objects = [
Object(num: 3),
Object(num: 5),
Object(num: 6),
Object(num: 2),
Object(num: 4),
Object(num: 1)
]
var body: some View {
VStack {
ForEach(objects.sorted(by: {$0.num > $1.num}).indices, id:\.self) { i in
Text("\(objects[i].num)")
}
}
.padding()
}
}
uj5u.com熱心網友回復:
您的代碼沒有產生預期的結果,因為您使用排序陣列的索引作為原始陣列的下標:兩者
objects.indices
objects.sorted(by: {$0.num > $1.num}).indices
是范圍0 ..< objects.count,對陣列進行排序無效。因此
Text("\(objects[i].num)")
以原始順序顯示物件。
一個快速的解決方法是對索引進行排序:
ForEach(objects.indices.sorted(by: {objects[$0].num > objects[$1].num}), id:\.self) { i in
Text("\(objects[i].num)")
}
但是,如果您將Hashable一致性添加到您的自定義型別
extension Object : Hashable {
func hash(into hasher: inout Hasher) {
hasher.combine(id)
hasher.combine(position.x)
hasher.combine(position.y)
hasher.combine(num)
}
}
然后顯示排序的物件變得如此簡單
ForEach(objects.sorted(by: { $0.num > $1.num})) { obj in
Text("\(obj.num)")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/533789.html
標籤:ios数组迅速迅捷
上一篇:Swift-子類化URLSessionDataTask-哪個super.init(DataTaskFakeWrapper:URLSessionDataTask?????????)適用?
