簡體   English   中英

Swift 4:使用協議作為關聯類型的通用協議的實現

[英]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 BarType = Bar

解決了這個問題。 哪種是公平型推理能夠完成它的工作。

然而,它應該是一個合法的代碼,似乎是編譯器中的一個錯誤。

據此報道

我們應該使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM