簡體   English   中英

比較Swift中泛型關聯類型的類型

[英]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.

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