2015-07-02 78 views
1

我有一個協議叫做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’」

不知道我怎樣才能解決這個問題,無論是對象定義爲AnyObject,它確認了SomeProtocol協議,那麼這裏有什麼問題?

+0

問自己的問題:你期待'=='做什麼?這種在兩個任意'SomeProtocol'類型上使用'=='的能力來自哪裏?你定義了一個帶有兩個'SomeProtocol'的'=='運算符嗎?你想_reference_平等('==='而不是'==')? –

+0

是的,我想要一個參考平等只是爲了檢查這是否是相同的對象,但===不工作以及 – Mario

+0

可能重複的[在Swift中比較兩個自定義對象](http://stackoverflow.com/questions/ 29942511 /比較兩個自定義對象在迅速),和[這個答案](http://stackoverflow.com/a/29943227/1187415)應該解決您的問題。 –

回答

0

通用功能還必須符合Equatable協議

+0

不像這種情況那麼簡單 - 該數組是由協議而不是實際對象組成的,因此需要將兩個可能不同的類型等同於遵循相同的協議。 –

+0

我應該定義一個AnyObject數組來確認協議嗎?我可以這樣做嗎? – Mario

+0

不,你不能那樣做,因爲'Equatable'有一個關聯類型 - 它只能用作約束,你不能擁有一個不同的'Equatable'類型的數組。 –

1

如果你想引用相等,那麼你需要確保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) 
    } 
} 
+0

由於某種原因,我無法在我的陣列上調用indexOf – Mario

+0

這是一個2.0功能,如果您使用的是1.2,您仍然需要在原始問題中使用循環。 –

+0

可以舉例說明如何從數組中循環和移除對象?在Objective C中,我用來將這些objectsToRemove存儲在一個數組中,然後調用removeObjectsInArray: – Mario

0

用於比較兩個泛型,你可以聲明泛型這樣,類型,即能夠被在您的通用類型的地方,應符合Comparable協議。

struct Heap<T: Comparable>{ 
var heap = [T]() 
}} 

現在,我們將能夠做到: -

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

如何工作的嗎?

正如我們所知,符合協議意味着在該協議中實現所有必需的方法。 可比較協議已將所有比較方法作爲所需參數,並且任何正在實施的類型可比較的都可以做比較。

使用泛型的快速編碼。