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