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

SwiftUI实现Toggle Switch报错:向无参数调用传递参数

问题原因&修复方案

这个报错的核心原因是你使用的 Toggle.init(_:sources:isOn:) 初始化器仅支持macOS 13.0+(Ventura)和iOS 16.0+,而你的系统是macOS 12.6.3(Monterey),不符合最低版本要求,所以编译器找不到这个带参数的初始化方法,误判为“向无参数调用传递参数”。


修复方案

方案1:升级系统

直接将macOS升级到13.0或更高版本,之后就能正常使用官方文档里的这个API。

方案2:兼容旧版本的写法

如果不想升级系统,改用兼容macOS 12的Toggle实现方式:

基础绑定写法

如果只是单个开关状态,用最基础的绑定初始化器即可:

@State private var isToggleOn = false

var body: some View {
    Toggle("开关标题", isOn: $isToggleOn)
}

多源状态合并(替代sources参数)

如果需要实现类似官方文档中多源状态绑定的逻辑,可以手动合并多个布尔值:

@State private var settingAEnabled = false
@State private var settingBEnabled = false

// 自定义合并后的状态逻辑(这里以“全部开启”为例,可根据需求修改)
private var allSettingsEnabled: Bool {
    settingAEnabled && settingBEnabled
}

var body: some View {
    Toggle("全部开启", isOn: Binding(
        get: { allSettingsEnabled },
        set: { newValue in
            // 切换时同步更新所有子状态
            settingAEnabled = newValue
            settingBEnabled = newValue
        }
    ))
}

如果需要监听子状态的自动更新,也可以结合Combine框架实现:

import Combine

@State private var settingAEnabled = false
@State private var settingBEnabled = false
@State private var allSettingsEnabled = false
private var cancellables = Set<AnyCancellable>()

var body: some View {
    Toggle("全部开启", isOn: $allSettingsEnabled)
        .onChange(of: allSettingsEnabled) { newValue in
            settingAEnabled = newValue
            settingBEnabled = newValue
        }
        .onAppear {
            // 监听子状态变化,自动更新合并后的状态
            Publishers.CombineLatest($settingAEnabled, $settingBEnabled)
                .map { $0 && $1 }
                .assign(to: \.allSettingsEnabled, on: self)
                .store(in: &cancellables)
        }
}

内容的提问来源于stack exchange,提问作者Clara Puglisi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:23:18