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

Swift开发:解决「Cannot convert value of type 'Void' to expected argument type '(String) -> Void'」错误

解决SwiftUI中Cannot convert value of type 'Void' to expected argument type '(String) -> Void'错误

嘿,这个问题我之前开发SwiftUI的时候也踩过坑!咱们先搞清楚错误的根源:

你在Picker的onChange回调里直接调用了updateSymbolsPadding函数,而不是传递一个符合要求的闭包类型。onChange(of:perform:)的perform参数需要的是一个接收String类型参数(也就是选中的新符号值)、返回Void的闭包,但你现在写的updateSymbolsPadding(symbolType: symbolOne, symbolSize: &symbolOneSize)是直接执行了这个函数,它的返回值是Void,这就和perform要求的(String) -> Void类型不匹配,所以报错了。

解决方案很简单,两种方式都可以:

方式一:用闭包包裹函数调用(推荐)

把onChange的代码改成这样,利用onChange自动传递的新值:

.onChange(of: symbolOne) { newSymbol in
    updateSymbolsPadding(symbolType: newSymbol, symbolSize: &symbolOneSize)
}

这里的闭包会接收symbolOne变化后的新值newSymbol,然后在闭包内部调用你的updateSymbolsPadding函数,完全符合perform参数要求的类型。

方式二:调整函数返回闭包(可选)

如果你想让updateSymbolsPadding直接适配onChange的要求,可以修改函数定义,让它返回一个(String) -> Void的闭包:

func updateSymbolsPadding(symbolSize:inout Double) -> (String) -> Void {
    return { symbolType in
        var size: Double
        switch symbolType {
        case "multiply":
            size = 2.4
        case "circle", "triangle", "square", "pentagon", "octagon":
            size = 2.0
        default:
            size = 2.0 // 加个默认值更安全
        }
        symbolSize = size
    }
}

然后调用的时候就可以直接传函数引用了:

.onChange(of: symbolOne, perform: updateSymbolsPadding(symbolSize: &symbolOneSize))

顺便提一句,把原来的多个else if改成switch语句,代码会更简洁易读哦~

额外小提示

以后碰到类似的回调参数类型不匹配问题,先看清楚参数要求的是函数类型还是函数执行后的返回值,直接调用函数会返回它的结果,而传递闭包或者函数引用才是符合要求的做法。

内容的提问来源于stack exchange,提问作者Lorenzo Zorri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:27:47