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

SwiftUI中如何声明绑定Enum类型的变量?

SwiftUI中绑定Enum类型变量的正确方式

错误原因

你遇到的两个错误(Cannot infer contextual base in reference to member、No exact matches in call to initializer)是因为**@Binding类型的变量不能在子视图中直接设置默认值**。Binding的作用是在父视图和子视图间共享状态,它的初始值必须由父视图通过$语法传递过来,子视图本身不能给Binding变量赋初始值。

修复后的代码

子视图修改

移除KeyboardBackLightResultView中@Binding变量的默认值赋值:

struct KeyboardBackLightResultView: View {
    // 去掉默认值 = .byDefault
    @Binding var isKeyboardBackLightAvailable : BackLightStatus
    
    var body: some View {
        switch isKeyboardBackLightAvailable {
        case .available:
            Text("Keyboard BackLight is available and started to Flash. ")
                .padding()
                .font(.system(size: 16))
        case .notAvalable:
            Text("Keyboard BackLight is not available")
                .padding()
                .font(.system(size: 16))
                .foregroundColor(.red)
        case .byDefault:
            EmptyView()
        }
    }
}

父视图确认

你的父视图KeyboardBackLightMainView中已经正确通过$isBackLightAvailable传递绑定,这部分无需修改:

NavigationView {
    keyboardBackLightTestButton()
    KeyboardBackLightResultView(isKeyboardBackLightAvailable: $isBackLightAvailable)
}

额外说明

  • @Binding本质是对父视图@State(或其他可绑定源)的引用,其值完全由绑定源控制,子视图仅负责读取和修改,不能自行初始化。
  • 若需子视图在无外部绑定时有默认行为,可通过init方法为Binding提供默认 fallback,但你的代码结构已符合标准父子视图状态传递模式,直接移除默认值即可解决问题。

内容的提问来源于stack exchange,提问作者MD Sazid Hasan Dip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 06:33:26