簡體   English   中英

區分Swift協議中繼承的`associatedtype`

[英]Distinguishing between inherited `associatedtype`s in Swift protocols

我正在使用一個庫來定義兩個協議AB ,每個協議都有associatedtype T ,如下所示:

protocol A {
    associatedtype T
}
protocol B {
    associatedtype T
}

這兩個協議沒有在T上耦合,因此理論上第三個協議可以從AB繼承, typealias每個T類型typealias不同的類型。 不幸的是,我無法讓Swift區分這兩個T 我嘗試過類似的東西:

protocol C: A, B {
    typealias A.T = String
    typealias B.T = String
}

但這不支持語法。 有辦法解決這個問題嗎?

這已在Swift論壇中的多協議關聯類型名稱沖突中討論過。 吳小迪寫道:

這是非常可能的,但是在相符類型中,相同名稱的關聯類型必須由相同類型實現。

在將來,可能會添加語法以允許類型符合具有此類沖突要求的兩個協議,但它在實現方面增加了極大的復雜性並且對用戶而言並非沒有它自己的陷阱(例如,它可能會變得非常混亂您的類型的最終用戶)。

因此,類型可以符合具有相同關聯類型T AB兩者,例如

struct Foo: A, B {
    typealias T = String
}

並且協議可以從AB繼承並將T限制為相同的類型:

protocol C: A, B where T == String {

}

目前不支持符合具有不同關聯類型的兩種協議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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