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

SwiftUI LongPressGesture的onEnded修饰符传递无参函数报类型转换错误

报错原因

LongPressGesture的.onEnded修饰符要求传入的回调函数必须接收一个Bool类型的参数(即LongPressGesture.Value,代表手势是否成功触发),对应函数类型是(Bool) -> Void。
而你当前的startTimer是无参数函数,类型为() -> Void,和要求的参数类型不匹配,因此直接传入会触发类型转换报错。
你用闭包包裹可以正常运行的原因是:Swift 闭包支持自动忽略不需要的入参,你没有声明接收.onEnded传入的Bool值时,编译器会默认忽略这个参数,匹配到内部startTimer()的无参调用。

直接传入函数的解决方案

方案1:修改startTimer的函数定义

给startTimer加一个无标签的Bool占位参数,不需要修改内部逻辑:

// 函数定义加下划线占位参数,不需要用到这个值
func startTimer(_: Bool) {
    // 原有逻辑保持不变
}

修改后就可以直接传入函数使用:

LongPressGesture(minimumDuration: 0.25).onEnded(startTimer)

方案2:用通用高阶函数包装无参函数

如果不想修改原有startTimer的定义,可以提前定义一个通用的参数丢弃工具函数,把无参函数转换成符合.onEnded要求的类型:

func ignoreInput<T>(_ action: @escaping () -> Void) -> (T) -> Void {
    return { _ in action() }
}

使用时直接包装即可:

LongPressGesture(minimumDuration: 0.25).onEnded(ignoreInput(startTimer))

内容的提问来源于stack exchange,提问作者Joe Scotto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:15:02