ios - 将 JSON 响应分配给模型 SwiftUI
问题描述
我通过创建模型成功解析了 JSON。但现在我想要一个视图模型,它与视图对话,并且视图在模型更新时更新。但我很难初始化模型。
我的简化模型如下所示。
PeopleListM.swift
import SwiftUI
import Alamofire
struct PeopleListM: Decodable {
var all: [Person]
enum CodingKeys: String, CodingKey {
case all = "people"
}
struct Person: Decodable {
let name: String
let email: String
let favorite: Bool
let lastSent: String?
enum CodingKeys: String, CodingKey {
case name
case email = "email_id"
case favorite
case lastSent = "last_sent"
}
}
init() {
let headers: HTTPHeaders = ["disableauth" : "true", "Content-Type": "application/json"]
AF.request("MY URL", parameters: nil, headers: headers)
.validate()
.responseDecodable(of: PeopleListM.self) { (response) in
guard let result = response.value else { return }
self.all = result.all
}
}
这段代码给了我错误Escaping closure captures mutating 'self' parameter
,我尝试用 换行self.all = result.all
,self = result
同样的错误。
我的进一步计划是创建一个符合ObservableObject
PeopleListVM.swift
import SwiftUI
class PeopleListVM: ObservableObject {
let people = PeopleListVM.createModel()
static func createModel() {
PeopleListM()
}
}
解决方案
final class PeopleListVM: ObservableObject {
@Published var people = PeopleListVM.createModel()
static func createModel() {
PeopleListM()
}
func request() {
// networking here...
// update people in callback
// ... self.people = newPeople
}
}
struct Model: View {
@ObservableObject var vm = PeopleListVM()
// ...
}
您通常不会将网络代码放入 中struct
,因为网络总是伴随着状态变化,而值类型意味着是不可变的。
推荐阅读
- node.js - 在文件夹中创建 Google 表格文档(不移动和删除旧的)
- python - Python 绘图时间列表
- java - .classpath 文件阻止了 git rebase
- artifactory - JFrog CLI 无法为 JFrog Artifactory 中的工件设置属性作为第一个属性名称并使用 SSH 密钥示例进行多属性搜索
- laravel-5 - 插入一对一多态关系laravel 5时,“字段列表”中的未知列“imageable_type”
- r - Xaringan 情节不渲染:网站正在减慢您的浏览器您想做什么
- java - 无法使用 Apache POI 删除行,因为单元格包含电子邮件地址
- css - 如何显示被其他div覆盖的div
- regex - 带有正则表达式的 Makefile 模式规则
- scala - 匹配运行计算的结果在 for comprehension 中无效