如何在SwiftUI列表中显示字典数组?

时间:2019-12-15 19:40:48

标签: swift swiftui

在通过迁移旧版ObjC应用程序的一部分学习Swift之后,我期待着在纯Swift中启动一个新应用-我希望使用纯Swift基类可以减少解包和其他架桥的恶作剧。

但是,很快我发现自己也面临类似的问题。

我想从Web服务中读取一些JSON,并显示在使用SwiftUI实现的列表中-应该很简单,对吧?

数据(实际上是从Twitter API读取的)输入了,我将其反序列化,

    do {
        if let results = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments  ) as? [String: Any] {
            print(results)
            if let followers = results["users"] as? [[String: Any]] {
                print (followers.count)
                print("followers class \(type(of: followers))")
            } else {
                print(results["errors"])
            }
        }
    } catch let error as NSError {
        print(error.localizedDescription)
    }

您会看到我打印了关注者的类别,这显示了,

followers class Array<Dictionary<String, Any>>

...使用Swift基类的一系列漂亮的Dictionary。通过SwiftUI中的List呈现的数据结构似乎很合理。但是,它似乎并不那么简单,因为数据元素必须是可识别的(足够公平),但是我没有每个元素的结构,并且我不希望将数组处理为一个数组的开销。带有标识符的结构数组。

一些研究,似乎有解决方案,因为我可以使用数组初始化List,如下所示:

var body: some View {
    List (twitter.followers!, id: \.self) { follower in // <<< Compilation error
        Text("\(follower["name"])")
    }
}

但是,该代码在标记行上给出了编译错误,

  

协议类型“ Any”不能符合“ Hashable”,因为仅具体   类型可以符合协议

我认为问题在于编译器将跟随者视为“任何”,而不是数组,但是为什么?

顺便说一句,我已经看到了this question的答案,但是似乎列表初始化程序应该是一个更优雅的解决方案,如果我能使它工作的话……

1 个答案:

答案 0 :(得分:0)

您必须为关注者/用户创建一个结构,并将其声明为DecodableIdentifiable

然后,您将可以使用JSONDecoder将结构中的数据读入数组。

因此,您的twitter.followers将是一组可识别的对象,您将可以在ForEach()中使用它。