Swift编写touchesBegan方法报表达式类型歧义错误咨询
报错原因
这个歧义错误本质是类型推断失败,由几个写法问题共同引发:
- 自定义的
touchesBegan方法签名不符合UIKit/SpriteKit的父类方法定义:参数标签、参数类型都存在错误,第二个参数的外部标签应该是with(老版本Swift为withEvent),不是withEvents。 touches集合的类型声明错误:父类方法中该参数是UITouch触摸对象的集合,不是无类型的NSSet。循环中把元素声明为AnyObject后,编译器无法确认这个对象存在locationInNode(_:)方法,无法推断表达式的合法类型,就会直接抛出歧义报错。- 未对集合内元素做明确的类型声明,编译器无法匹配到SpriteKit提供的触摸位置获取方法。
可行修复方案
根据使用的Swift版本选择对应写法即可:
Swift 3及以上主流版本
严格匹配系统方法签名重写回调:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { // 安全取出第一个触摸对象,避免空值异常 guard let touch = touches.first else { return } let location = touch.location(in: self) player.position.x = location.x }
Swift 2.x 老版本
适配老版本API规则,手动做类型校验:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { guard let touch = touches.first else { return } let location = touch.locationInNode(self) player.position.x = location.x }
核心修复逻辑:
- 重写系统回调方法必须严格匹配父类的方法定义,不要自行修改参数标签和参数类型,否则系统不会把这个方法识别为触摸事件回调,还会触发类型推断错误。
- 不要把触摸对象声明为
AnyObject类型,明确指定为UITouch后编译器就能正确识别对应的位置获取方法。 - 增加空值安全校验,避免触摸集合为空时出现运行时异常。
内容的提问来源于stack exchange,提问作者Zidane Alfarizi
相关产品推荐
相关产品推荐

