Swift2迁移Swift4遇类型转换错误:'(_) -> ()'无法转为'(() -> Void)?'
解决Swift 2迁移到Swift 4时的闭包类型不匹配错误
这个错误的核心问题是你调用navigateToTagFriends函数时传入的闭包签名,和函数定义要求的闭包类型不匹配。
错误原因拆解
你的函数明确要求闭包必须接收一个可选的[Athlete]类型参数:
fileprivate func navigateToTagFriends(completion: @escaping (_ taggedUsers : [Athlete]?) -> Void) { // 函数实现 }
但你调用这个函数时,传入的是一个不需要任何参数的闭包(也就是() -> Void类型)。Swift 4对类型匹配的要求比Swift 2严格得多,所以直接抛出了类型转换失败的错误。
具体修复方案
只需要调整调用处的闭包,让它符合函数定义的签名即可,有两种常见方式:
- 接收并处理参数(推荐,即使暂时用不到参数,也保持签名一致性)
// 调用示例 navigateToTagFriends { taggedUsers in // 这里可以根据需要处理taggedUsers数组 // 比如打印、更新UI等 print("标记的用户:\(taggedUsers ?? [])") // 你的原有业务逻辑 }
- 忽略参数(如果确实不需要使用
taggedUsers参数)
// 调用示例 navigateToTagFriends { _ in // 你的原有业务逻辑,不需要处理参数 }
迁移小提醒
Swift 3之后闭包默认是**非逃逸(non-escaping)**的,你在函数定义里已经正确添加了@escaping关键字(如果这个闭包会被异步执行或者存储到属性中,这个关键字是必须的),这部分不需要修改。
内容的提问来源于stack exchange,提问作者Puja Jadhav
相关产品推荐
相关产品推荐

