提问人:spoax 提问时间:11/16/2020 最后编辑:pawello2222spoax 更新时间:11/16/2020 访问量:279
在 Array 中移动/重新排序特定项目 - SwiftUI
Move/Reorder specific item in Array - SwiftUI
问:
我在数据结构中有一个一堆或数组,我将它们组合成一个数组并删除任何重复项。是否可以将项目移动到数组的顶部,使其在列表中排在第一位?我想出现在列表的顶部,但由于 .All
Agriculture
以下是数据结构中的一些数组:
let productData: [ProductModel] = [
ProductModel(application: ["All", "Clean Chemistry", "Food", "Agriculture", "Polymers"]),
ProductModel(application: ["All", "Food", "Agriculture", "Gin", "Polymers"]),
ProductModel(application: ["All", "Metals", "Polymers"]),
]
这是我组织数组并将其呈现在 HStack 中的地方:
struct ProductList: View {
var applicationsArray = Array(Set(productData.flatMap(\.application))).sorted()
var body: some View {
ScrollView(.horizontal){
HStack{
ForEach(applicationsArray, id: \.self) { item in
Button(action: {
// SELECT ITEM
}) {
VStack(alignment: .center){
Image(item)
Text(item)
}
}
}
}
}
}
}
答:
3赞
vacawama
11/16/2020
#1
使用提供的闭包对列表的前面进行排序:sorted(by:)
"All"
var applicationsArray = Set(productData.flatMap(\.application))
.sorted { (a: String, b: String) -> Bool in
a == "All" ? true : b == "All" ? false : a < b
}
解释
您提供给的闭包由重复调用,它一次采用两个元素,并决定第一个元素是否应该出现在第二个元素之前。由于您希望出现在列表的开头,那么如果闭包作为第一个元素接收,它应该返回,因为先于其他元素。如果闭包作为第二个元素接收,则返回,因为前面没有元素。最后,如果不是发送到闭包的元素之一,它只是比较第一个元素是否在第二个字典之前使用 .sorted(by:)
sorted
"All"
"All"
true
"All"
"All"
false
"All"
"All"
a < b
评论
0赞
spoax
11/16/2020
尝试此操作时出现此错误:The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions
1赞
vacawama
11/16/2020
我通过明确闭包的类型来修复它。
2赞
Harshil Patel
11/16/2020
#2
首先,从列表中删除重复项,然后筛选出要在列表顶部显示的项目,并筛选出除顶部项目之外的其他项目,并将它们添加在一起。简单吧?
var yourList = ["All", "Clean Chemistry", "Food", "Agriculture", "Polymers", "All", "Food", "Agriculture”, "Gin”, "Polymers”, "All”, "Metals”, "Polymers”]
var removeDuplicates = Array(Set(yourList)).sorted()
print(removeDuplicates)
var getAllFromTheList = removeDuplicates.filter(){$0 == "All"}
print(getAllFromTheList) // [“All”]
var removeAllFromTheList = removeDuplicates.filter(){$0 != "All"}
print(removeAllFromTheList) // [“Agriculture”, “Clean Chemistry”, “Food”, “Gin”, “Metals”, “Polymers”]
let newList = getAllFromTheList + removeAllFromTheList
print(newList) // [“All”, “Agriculture”, “Clean Chemistry”, “Food”, “Gin”, “Metals”, “Polymers”]
评论
0赞
spoax
11/16/2020
谢谢你分解它,这一切都是有道理的。我认为@vacawama的答案也很棒,因为它很紧凑。
0赞
Harshil Patel
11/16/2020
是的,我也喜欢他的回答,但对于初学者来说很难理解。这就是为什么我一步一步地解释它:)
评论