[英]swift how to compare generics
我有一個名為SomeProtocol
的協議
我想創建一個函數,獲取一個確認該協議的對象,並將其添加到數組中。
然后我有另一個從該數組中刪除對象的函數。
var allObjs = [SomeProtocol]()
func addObj<T: AnyObject where T: SomeProtocol>(obj: T) {
allObjs.append(obj)
}
func removeObj<T: AnyObject where T: SomeProtocol>(obj: T) {
for someObj in allObjs {
if someObj == obj { // compile time error -> Binary operator '==' cannot be applied to operands of type 'SomeProtocol' and 'T'
}
}
}
此代碼將導致編譯時錯誤“二進制運算符'=='不能應用於'SomeProtocol'和'T'類型的操作數”
我不確定如何解決這個問題,這兩個對象都定義為確認為SomeProtocol協議的AnyObject,那么這里的問題是什么?
如果你想要引用相等,那么你需要確保SomeProtocol
只適用於類(因為你不能在結構上使用引用相等,因為它們是值類型):
protocol SomeProtocol: class { }
現在,只有類可以實現SomeProtocol
。
你現在不需要泛型來使用引用相等,只需要常規的運行時多態性:
func removeObj(obj: SomeProtocol) {
// since any SomeProtocol-conforming object
// must be a class, you can now use ===
if let idx = allObjs.indexOf({ $0 === obj}) {
allObjs.removeAtIndex(idx)
}
}
泛型函數還必須符合Equatable
協議
為了比較兩個泛型,您可以聲明泛型,使得能夠代替泛型類型的類型應符合Comparable協議。
struct Heap<T: Comparable>{
var heap = [T]()
}}
現在我們可以做到: -
if heap[parentIndex] < heap[childIndex] {
//Your code
}
這是怎么回事?
我們知道,符合協議意味着在該協議中實現所有必需的方法。 可比協議已將所有比較方法作為必需參數,並且任何實現Comparable的類型都能夠進行比較。
使用泛型的快樂編碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.