如何正确编写返回some Gesture或SimultaneousGesture的SwiftUI函数?
报错原因
你遇到的类型不匹配报错是 Swift 不透明类型(some Gesture)的正常限制:some Gesture 要求所有返回路径的底层具体类型必须完全一致,而 makeGesture1() 的返回类型和 SimultaneousGesture 属于完全不同的两种具体类型,所以编译器会抛出错误。
方案1:拆分手势修饰符(最推荐)
不需要把手势逻辑合并到同一个表达式里,直接拆分添加修饰符即可,完全规避类型匹配问题,也符合 SwiftUI 声明式语法习惯:
Text("abc") // 始终生效的手势1 .gesture(makeGesture1()) // 仅当条件不成立时,才同时添加手势2 .simultaneousGesture(someCondition ? nil : makeGesture2())
方案2:用 AnyGesture 做类型擦除(标准官方实现,不是 hack)
如果你确实需要将条件手势封装为单个函数返回,AnyGesture 是 SwiftUI 标准库专门设计用于手势类型擦除的工具,属于规范用法。你可以简化你之前的写法,不需要额外做 map 转换:
func makeGestureConditionally() -> some Gesture { if someCondition { return AnyGesture(makeGesture1()) } else { return AnyGesture(makeGesture1().simultaneously(with: makeGesture2())) } }
调用方式如下:
Text("abc") .gesture(makeGestureConditionally())
内容的提问来源于stack exchange,提问作者Herman
相关产品推荐
相关产品推荐

