簡體   English   中英

swift如何比較泛型

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

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