SwiftUI重新赋值@ObservedObject报错:Cannot assign to property: 'self' is immutable
解决SwiftUI中@ObservedObject重新赋值的"self is immutable"错误
错误原因
MyApp是值类型(结构体),默认情况下结构体的属性不可直接修改,直接赋值self.datastream会触发"self is immutable"错误。@ObservedObject的设计目的是接收父视图传递的ObservableObject实例,而非在当前视图内部存储并修改实例引用。
解决方案
方案1:用@State替换@ObservedObject(推荐用于需要替换实例的场景)
将datastream的修饰符改为@State,因为@State允许在结构体内部修改其包装的值(对于引用类型,修改的是实例引用),同时SwiftUI会自动监听DataStream的@Published属性变化,触发视图更新。
修改后的代码:
struct MyApp: App { // 修正原语法错误:@State需要直接初始化值 @State var dataSource = Datasource() @State var datastream = DataStream("defaultStream") var body: some Scene { WindowGroup { ContentView() .onAppear { // 现在可正常赋值替换实例 self.datastream = dataSource.subscribe(streamName: "someStream") } // 如果ContentView需要使用datastream,通过environment传递 .environmentObject(datastream) } } }
方案2:用@StateObject结合可选类型(iOS14+)
如果偏好使用@StateObject(SwiftUI推荐用于持有ObservableObject的修饰符),可以将其声明为可选类型,实现实例替换:
struct MyApp: App { @State var dataSource = Datasource() @StateObject var datastream: DataStream? = DataStream("defaultStream") var body: some Scene { WindowGroup { // 先判空再使用实例 if let stream = datastream { ContentView() .environmentObject(stream) .onAppear { let newStream = dataSource.subscribe(streamName: "someStream") self.datastream = newStream } } } } }
额外修正
原代码中@State var dataSource: Datasource()是语法错误,正确写法为@State var dataSource = Datasource(),因为@State需要直接初始化属性值而非仅声明类型。
内容的提问来源于stack exchange,提问作者Avba
相关产品推荐
相关产品推荐

