簡體   English   中英

在Swift 2.0上比較兩個通用對象

[英]compare two generic objects on swift 2.0

我必須確定當前值是否等於給定的比較值。

public static func Is<TBaseValue, TComparingValue>(baseValue: TBaseValue, comparingValue: TComparingValue) -> Bool
{
    return baseValue == comparingValue
}

我幾乎嘗試了

public static func Is<TBaseValue: Comparable, TComparingValue: Comparable>(baseValue: TBaseValue, comparingValue: TComparingValue) -> Bool
{
    return baseValue==comparingValue
}

和這個

  public static func Is<TBaseValue: Equatable, TComparingValue: Equatable>(baseValue: TBaseValue, comparingValue: TComparingValue) -> Bool
{
    return baseValue == comparingValue
}

但總是有相同的結果Binary運算符無法應用...

Equatable並不完全意味着這一點。 考慮一下相等的東西-例如Int 2 == 2有意義。 2 == 3將返回false但仍然有意義。 現在,考慮一下其他的Equatable - String

"abc" == "abc" // true
"acb" == "abc" // false

很好-但是呢:

"abc" == 4

Equatable東西對自己是Equatable ,而不是其他一切。 在您的示例中,您正在比較兩種不同的類型TBaseValue, TComparingValue

如果要比較任何值,可以使用重載:

static func Is<T: Equatable>(first: T, second: T) -> Bool {
    return first == second
}

static func Is<T1, T2>(first: T1, second: T2) -> Bool {
    return false
}

因此,最合適的功能會自動被調用。 如果無法使用傳遞的參數調用第一個函數,則無論如何都要調用第二個函數。

這適用於Swift 2.0。

func Is<Any : Equatable>(l: Any, _ r: Any) -> Bool {
    return l == r
}

Is("a", "a") // true
Is("a", "b") // false
Is(1, 1)     // true

它也可以與AnyObject一起AnyObject

為了比較兩個泛型,可以聲明泛型,使得能夠代替您的泛型類型的類型應符合Comparable協議。

struct Heap<T: Comparable>{
var heap = [T]()
mutating func insert(element: T){
heap.append(element)
var index = heap.count - 1
heapify(childIndex: index)
}}

現在我們將能夠:

if heap[parentIndex] < heap[childIndex] {
//Your code
}

如何運作?

眾所周知,遵守協議意味着在該協議中實現所有必需的方法。 可比協議已將所有比較方法作為必需參數,任何實現可比的類型都可以進行比較。

使用泛型進行快樂編碼

暫無
暫無

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

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