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
相关产品推荐
相关产品推荐

