You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中如何将@ObservedObject的字符串isEmpty值传入@Binding?

解决方案

方案1:在视图模型中封装绑定逻辑

如果需要保留BoolView的@Binding声明(比如未来可能要支持修改操作),可以把绑定的构造逻辑移到视图模型中,让视图代码更简洁:

修改MainViewModel,添加返回Binding<Bool>的计算属性:

@MainActor
final class MainViewModel: ObservableObject {
    @Published var magicString = ""

    // 封装绑定逻辑
    var activeBinding: Binding<Bool> {
        Binding(
            get: { !self.magicString.isEmpty },
            set: { _ in 
                // 当前无需修改操作,留空即可;未来需要时可在此添加修改magicString的逻辑
            }
        )
    }

    init(magicString: String = "") {
        self.magicString = magicString
    }
}

然后在MainView中直接传入该绑定:

struct MainView: View {
    @ObservedObject var viewModel: MainViewModel
    var body: some View {
        BoolView(active: viewModel.activeBinding)
    }
}

方案2:改用只读属性简化视图

如果BoolView仅负责展示状态,不需要修改这个布尔值,完全可以去掉@Binding,改用普通的只读属性:

修改BoolView:

struct BoolView: View {
    // 替换@Binding为只读常量
    let active: Bool
    
    var body: some View {
        HStack() {
            Image(systemName: active ? "checkmark.circle" : "xmark.circle")
                .foregroundStyle(active ? .green : .red)
            Text("Is magic happening?")
            Spacer()
        }
    }
}

在MainView中直接传入计算后的布尔值:

struct MainView: View {
    @ObservedObject var viewModel: MainViewModel
    var body: some View {
        BoolView(active: !viewModel.magicString.isEmpty)
    }
}

选择建议

  • 若未来BoolView需要支持修改操作(比如点击切换状态并同步更新magicString),优先选择方案1,后续可在视图模型的set闭包中补充修改逻辑;
  • 若BoolView仅做展示用,方案2是最优解,代码更轻量高效,完全避免了手动构造绑定的繁琐。

内容的提问来源于stack exchange,提问作者Rodrigo Ruiz Murguía

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:37:37