![](/img/trans.png)
[英]Swift: Cast generic type into same generic type but with a subclass of associated type
[英]Comparing type of Generic associated type in Swift
我有下一個代碼:
protocol Flyable {
var airspeedVelocity: Double { get }
}
func topSpeed<T: CollectionType where T.Generator.Element == Flyable>(collection: T) -> Double {
return collection.map { $0.airspeedVelocity }.reduce(0) { max($0, $1) }
}
通過閱讀Swift文檔 ,我了解到:
通過將where關鍵字放在類型參數列表之后,然后緊跟相關類型的約束或類型與相關類型之間的相等關系,來編寫where子句。
這是在文檔中給出的示例:
func allItemsMatch<C1: Container, C2: Container where
C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
(someContainer: C1, _ anotherContainer: C2) -> Bool {
// code
}
請注意,當表示C1
類型的關聯類型ItemType
必須符合Equatable
協議時,請使用:
而不是==
,為什么在我的示例中不是這樣,我必須使用==
來聲明Element
關聯類型的T.Generator
必須符合Flyable
嗎?
當改變==
有:
編譯器與此抱怨:
錯誤:無法使用類型為[[Flyable])的參數列表調用'topSpeed'注意:預期類型為'(T)'的參數列表
您無需使用泛型即可實現此目的。
protocol Flyable {
var airspeedVelocity: Double { get }
}
func topSpeed(collection: [Flyable]) -> Double {
return collection.map { $0.airspeedVelocity }.reduce(0) { max($0, $1) }
}
class Airplane: Flyable {
var airspeedVelocity: Double = 10
}
class Rocket: Flyable {
var airspeedVelocity: Double = 50
}
topSpeed([Airplane(),Rocket()]) //50
我在這里找到了原因。 where子句具有下一個語法:
conformance-requirement → type-identifier:type-identifier
same-type-requirement → type-identifier==type
因此,當您要聲明類型參數符合某些協議時,請使用:
。 但是,當您希望您的類型完全屬於某種類型時,可以使用==
。 在我的示例中,我想將Flyable
的集合作為參數。 因此,在嘗試使用時:
編譯器抱怨,因為Flyable
不符合Flyable
。 Flyable
IS Flyable
,因此我必須使用==
(或執行類似@Rahul Katariya回答的操作)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.