在从Swift 3.1迁移到Swift 4代码库时,我遇到了一个问题。
当您尝试实现一个带有协议作为关联类型的闭包的通用协议方法时,问题就会出现。听起来比实际要容易:)
以下代码在Swift 3.1中可以正常运行:
protocol FooType {
associatedtype BarType
func foo(bar: BarType)
func foo(action: (BarType) -> Void)
}
protocol Bar {}
class Foo: FooType {
typealias BarType = Bar
// Compiles in both 3.1 and 4
func foo(bar: Bar) {
}
// ERROR: Candidate has non-matching type (Bar) -> Void
func foo(action: (Bar) -> Void) {
}
}
但是在Swift 4中,编译器给我报错,说类Foo
不符合协议FooType
,而且缺少foo(action:)
方法的实现。
顺便说一句,Xcode 9的"修复"功能生成了与我的实现相同的代码。
如果我使用BarType
作为参数类型,则代码将会编译通过,但失去具体类型信息并不好。