[英]Swift 4: Implementation of a generic protocol with protocol as an associated type
我在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“fix-it”生成了我所擁有的相同實現。
如果我使用BarType
作為參數類型,代碼會編譯,但是松散具體類型信息並不好。
我們應該使用typealias泛型變量將類型提供給協議的associatedType。 我會在函數中使用typealias泛型變量名。 這更有意義和合法,但我仍然不知道為什么編譯器不知道閉包中的typealias參數。
class Foo: FooType {
typealias BarType = Bar
func foo(bar: BarType) {
/*Code*/
}
func foo(action: (BarType) -> Void) {
/*Code*/
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.