使用函数作为变量语法时Xcode代码自动补全失效问题咨询
Xcode 9.3中Typealias函数类型导致闭包参数类型推断失效的问题
我之前在Xcode 9.3里碰到过完全一样的坑!当用typealias定义函数类型别名,再把闭包赋值给该类型的变量时,Xcode的代码补全和类型推断会出现异常,导致闭包内的参数显示<<error type>>,自动补全功能也直接失效。
先重现一下你遇到的问题代码:
typealias MyFunction = (_ foo: Int) -> Void let myFunction: MyFunction = { foo in print(foo) // 此处foo显示<<error type>>,无自动补全 }
问题原因
这其实是Xcode 9.3的一个已知编辑器bug,它没有正确地将typealias中定义的参数类型信息传递到闭包内部,导致类型推断失效,进而影响了代码补全功能。这个问题在后续的Xcode版本(比如Xcode 10及以上)已经被官方修复了。
临时解决办法(针对Xcode 9.3)
如果暂时无法升级Xcode,可以试试这几个方案:
- 显式指定闭包参数类型:虽然有点冗余,但能强制Xcode识别参数类型,恢复自动补全:
let myFunction: MyFunction = { (foo: Int) in print(foo) // 现在foo类型正常显示,自动补全可用 } - 跳过typealias,直接声明函数类型:如果场景允许,直接在变量定义时写完整的函数类型,Xcode的类型推断会正常工作:
let myFunction: (_ foo: Int) -> Void = { foo in print(foo) // 类型显示正常,补全功能恢复 } - 升级Xcode版本:这是最彻底的解决方式,升级到Xcode 10或更高版本后,这个编辑器bug就被修复了,使用
typealias定义的函数类型能正常被闭包识别,自动补全也会恢复正常。
内容的提问来源于stack exchange,提问作者Alex Bollbach
相关产品推荐
相关产品推荐

