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()
    }
}