【问题标题】:Convert dictionary to array - Swift 5将字典转换为数组 - Swift 5
【发布时间】:2021-10-18 03:21:12
【问题描述】:

我有以下字典:

@Published var walletsTokenData: [Wallet: [TokenBalanceClassAModel]] = [:]

从 API 填充值后,我想遍历每个 Wallet 元素,将其命名为 a, b, c。问题是字典是无序的,我需要在我的视图中进行大量迭代和搜索,所以我认为一个更好的主意不是拥有字典,而是拥有一个数组,这样我也可以在视图中执行 @987654323 @

如何将该字典转换为数组?

我尝试了类似的方法:

@Published var x: [[[Wallet][TokenBalanceClassAModel]] = []

但它看起来很奇怪。这甚至正确吗?我需要能够将 1 个钱包(我在上面称为 a)链接到多个项目,然后将 b 链接到多个项目,但 a 和 b 以及它们的项目不相关。

我知道我在数据结构方面有一个弱点,这就是我寻求帮助的原因:)

我在字典里试过这个:

ForEach(walletsTokenData.keys, id: \.self) { key in

但它说:

Generic struct 'ForEach' requires that 'Dictionary<Wallet, [TokenBalanceClassAModel]>.Keys' conform to 'RandomAccessCollection'

我只是觉得数组更有意义

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    要以排序方式遍历每个 Wallet 元素,您可以试试这个:

    ForEach(walletsTokenData.keys.sorted(), id: \.self) { wallet in
    
    ...
    }
    

    您可以自定义排序,例如:

    ForEach(walletsTokenData.keys.sorted(by: {$0.value < $1.value}), id: \.self)
    

    其中 value 仅代表您想要对钱包进行排序的任何内容。请注意,您需要将 Wallet 设为 Hashable。

    编辑 1:这是一个例子:

    struct Wallet {
        var id: String = UUID().uuidString
        var address: String
        var amount: Double
    }
    
    struct ContentView: View {
        var walletsTokenData: [Wallet: [String]] = [
            Wallet(address: "Wallet1 address", amount: 5.0):["zzz"],
            Wallet(address: "Wallet2 address", amount: 2.0):["xxx"]]
        
        var body: some View {
            List {
                ForEach(walletsTokenData.keys.sorted(by: {$0.amount < $1.amount}), id: \.id) { wallet in
                    Text(wallet.address)
                }
            }
        }
    }
    

    要使钱包可识别和可哈希添加:

    extension Wallet: Identifiable, Hashable { }
    

    【讨论】:

    • 我如何知道它是针对哪个键排序的?在一个数组中,当您追加它时,您知道顺序,在这种情况下它将如何对它进行排序?是按字母、按数字还是按什么?它还说:Referencing instance method 'sorted()' on 'Sequence' requires that 'Dictionary&lt;Wallet, [TokenBalanceClassAModel]&gt;.Keys.Element' (aka 'Wallet') conform to 'Comparable'
    • 我已经更新了我的答案。向我们展示 Wallet 的代码以及您希望对它们进行排序的变量。
    • 我无法修改钱包并使其 Hashable 自动生成,它看起来像:struct Wallet: Model { public let id: String public var address: String ... }
    • 除此之外我还必须做几件事,但现在字典正在神奇地工作,感谢接受并 +1
    • 如何在没有 sort() 的情况下在 ForEach 中进行迭代?就像以添加到字典中的相同顺序打印项目?
    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2017-02-24
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2018-01-08
    相关资源
    最近更新 更多