2014-06-05 66 views
3

我想寫一個類似於NSArray的containsObject方法的擴展方法。下面是我的嘗試:無法將Swift對象轉換爲協議 - 該怎麼辦?

extension Array { 
    func contains(item: T) -> Bool { 
     for value in self { 
      if item == value { 
       return true 
      } 
     } 
     return false 
    } 
} 

我上線if item == value {一個錯誤,指出:

"Could not find an overload for "==" that accepts the supplied arguments." 

我試圖鑄造項目和值進行比較之前Equatable,但它不可能垂頭喪氣非-ObjC對象到一個協議

var equatableItem = item as Equatable 

的錯誤信息是:

"Cannot downcast from 'T' to [email protected] protocol type 'Equatable'" 

如何在Swift中實現此方法?我不想使用bridgeToObjectiveC並調用containsObject;如果在純Swift中編寫這樣的方法是可能的,那麼這更像是一個學術問題。

+0

@Sulthan感謝,正是我一直在尋找。 –

回答

1

問題是T已經被定義並且T的數組定義不符合Equatable。你可以通過施放來完成你想要的任務,並冒着無效投射的風險,或者你可以在不需要投射的情況下傳入一個委託。

考慮修改像這樣:

extension Array { 
    func contains(comparator: (T)->Bool) -> Bool { 
    for item in self { 
     if comparator(item) { 
      return true 
     } 
    } 
    return false 
    } 
} 

實例:

class Test { 
    func arrayContains(){ 
     var test: Int[] = [0,1,3,4,5] 
     //should be true 
     var exists = test.contains({(item)->Bool in item == 0}); 
    } 
} 
4

要添加,item as Equatable不起作用,因爲測試符合協議僅允許用於@objc協議(其Equatable不)。請參閱協議 - >在Swift編程語言手冊中檢查協議一致性。

您可以檢查協議的一致性只有當你的協議標 與@objc屬性

相關問題