我在 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
用作参数类型,则代码会编译,但丢失具体类型信息并不好。