【发布时间】:2017-06-08 18:10:30
【问题描述】:
我在从 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 作为参数类型,代码可以编译,但丢失具体类型信息并不好。
【问题讨论】:
标签: swift generics type-inference xcode9-beta swift4