在 Array 中移动/重新排序特定项目 - SwiftUI

Move/Reorder specific item in Array - SwiftUI

提问人:spoax 提问时间:11/16/2020 最后编辑:pawello2222spoax 更新时间:11/16/2020 访问量:279

问:

我在数据结构中有一个一堆或数组,我将它们组合成一个数组并删除任何重复项。是否可以将项目移动到数组的顶部,使其在列表中排在第一位?我想出现在列表的顶部,但由于 .AllAgriculture

以下是数据结构中的一些数组:

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)
                        }
                    }
                }
            }
        }
    }
}
数组 swiftui

评论


答:

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
是的,我也喜欢他的回答,但对于初学者来说很难理解。这就是为什么我一步一步地解释它:)