Swiftui @已发布的变量在没有didSet的情况下导致崩溃
我有一个Swiftui @已发布的变量在没有didSet的情况下导致崩溃,swiftui,Swiftui,我有一个observateObject视图模型,其中有一个@Published变量,该变量是一个枚举,指示viewModel的状态: class BatchesViewModel: ObservableObject { @Published private var lookupStatus: BatchLookupStatus = .none ... } enum BatchLookupStatus { case none case lookingUp(se
observateObject
视图模型,其中有一个@Published
变量,该变量是一个枚举,指示viewModel的状态:
class BatchesViewModel: ObservableObject {
@Published private var lookupStatus: BatchLookupStatus = .none
...
}
enum BatchLookupStatus {
case none
case lookingUp(searchText: String)
case error(errorMessage: String)
case validated(batch: Batch)
}
当出现错误或验证等情况时,我将状态设置为。当错误被排除时,我将状态设置为“无”
一切正常,除了我随机遇到一个EXC\u BAD\u访问崩溃
我想看看发生这种情况时的状态是什么,所以我在设置状态时放了一个print语句:
@Published private var lookupStatus: BatchLookupStatus = .none {
didSet {
print(_lookupStatus)
}
}
我注意到,通过打印声明,崩溃不再发生。事实上,如果我只留下一个空的didSet
,它也可以防止崩溃:
@Published private var lookupStatus: BatchLookupStatus = .none { didSet {} }
我一删除didSet
,它就会再次崩溃
到底发生了什么?我假设原因不在提供的模型中,因为经过测试,所有这些都按预期工作-我的意思是使用已发布的刷新流 以下是我所做的模型使用示例:
import SwiftUI
import Combine
class BatchesViewModel: ObservableObject {
@Published var lookupStatus: BatchLookupStatus = .none
}
enum BatchLookupStatus {
case none
case lookingUp(searchText: String)
case error(errorMessage: String)
}
struct TestPublishCrashed: View {
@ObservedObject var viewModel = BatchesViewModel()
var body: some View {
VStack {
Button(action: {
self.viewModel.lookupStatus = .error(errorMessage: "Search failed")
}) {
Text("Emulate Error").padding().background(Color.yellow)
}.padding()
Button(action: {
self.viewModel.lookupStatus = .lookingUp(searchText: "hello world")
}) {
Text("Emulate Query").padding().background(Color.yellow)
}.padding()
status.padding()
}
}
var status: some View {
switch viewModel.lookupStatus {
case .none:
return Text("No status")
case .error(let error):
return Text("Got error: \(error)")
case .lookingUp(let query):
return Text("Searching: \(query)")
}
}
}
struct TestPublishCrashed_Previews: PreviewProvider {
static var previews: some View {
TestPublishCrashed()
}
}