【发布时间】:2022-01-02 19:48:58
【问题描述】:
我在视图中显示反序列化的 JSON 对象时遇到问题。问题似乎是我的观点是在获取 JSON 对象的函数将任何内容分配给它之前尝试从已发布变量中解开一个值。
这里是调用api的代码
class ViewModel : ObservableObject {
@Published var posts : first?
init(subReddit : String){
fetch(sub: subReddit)
}
func fetch(sub : String) {
guard let url = URL(string: "https://www.reddit.com/r/" + sub + "/top.json?t=day") else {
return
}
let task = URLSession.shared.dataTask(with: url) { [weak self] data, _, error in
guard let data = data, error == nil else {return}
do{
let retVal = try JSONDecoder().decode(first.self, from:data)
DispatchQueue.main.async {
self?.posts = retVal
}
}
catch{
print(error)
}
}
task.resume()
}
}
这是我的观点的代码:
struct SubRedditView: View {
@StateObject var viewModel = ViewModel(subReddit: "all")
var body: some View {
NavigationView{
List{
ForEach((viewModel.posts?.data.children)!) {post in//at runtime I get a nil unwrap error here
Text(post.data.title)
Text(post.data.url_overridden_by_dest ?? "No Value")
}
}
.navigationTitle("Posts")
}
}
}
【问题讨论】:
-
提供一个默认值。尽可能避免选项,如果你必须让它们寻找它们并提供填充物。每一个 ?和 !应该先进行某种检查。