【问题标题】:Move/Reorder specific item in Array - SwiftUI移动/重新排序数组中的特定项目 - SwiftUI
【发布时间】:2020-11-15 16:08:00
【问题描述】:

我在一个数据结构中有一堆或多个数组,我将它们组合成一个数组并删除任何重复项。是否可以将一个项目移动到数组的顶部,使其在列表中排在第一位?我希望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)
                        }
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: arrays swiftui


    【解决方案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 &lt; b

    【讨论】:

    • 尝试此操作时出现此错误:The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions
    • 我通过明确闭包的类型来修复它。
    【解决方案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”]
    

    【讨论】:

    • 感谢您分解它,这一切都说得通。我认为@vacawama 的回答也很紧凑。
    • 是的,我也喜欢他的回答,但是对于初学者来说很难理解。这就是为什么我一步一步解释它的原因:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2020-11-15
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2021-11-30
    • 2022-01-02
    相关资源
    最近更新 更多