在通过迁移旧版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的答案,但是似乎列表初始化程序应该是一个更优雅的解决方案,如果我能使它工作的话……
答案 0 :(得分:0)
您必须为关注者/用户创建一个结构,并将其声明为Decodable
和Identifiable
。
然后,您将可以使用JSONDecoder
将结构中的数据读入数组。
因此,您的twitter.followers将是一组可识别的对象,您将可以在ForEach()
中使用它。