2015-05-21 263 views
0

我想寫一個數組擴展名,它將允許我從數組中刪除項目,如果它們存在於另一個數組中。我將需要使用這一系列的自定義類型,所以試圖建立一些通用的。從數組中刪除數組項目

這是我迄今爲止它返回錯誤「二進制運算符= =不能應用於2噸操作數」

extension Array{ 


    mutating func removeArrayItems<T>(itemsToRemove: [T]){ 

     for item in itemsToRemove{ 
      var removed = removeObject(item) 
     } 
    } 


    mutating func removeObject<T>(object: T) -> Bool { 
     for (idx, objectToCompare) in enumerate(self) { 
      if let to = objectToCompare as? T { 
       if object == to { 
        self.removeAtIndex(idx) 
        return true 
       } 
      } 
     } 
     return false 
    } 

} 

回答

3

等於運算符,==,只適用於那些Equatable對象。您需要將您的類型T限定爲T:Equatable。因此:

mutating func removeObject<T:Equatable>(object: T) -> Bool { 
    // ... 
} 

同樣的,removeArrayItems

請注意,如果您要定義自己的類型,如用classstruct,你的類型也需要符合Equatable。像這樣:

class Foo : Equatable { 
    // ... 
} 

public func ==<T:Foo> (lhs:T, rhs:T) -> Bool { 
    // ... 
} 
+0

太棒了!爲此非常感謝。現在編譯。然而,我仍然有這個問題,我似乎無法用自定義類型的數組來調用它。不過它適用於您的標準類型。 例如var arrayTimings:[Timing] = [Timing]() //填充數組 scheduledTimings.removeArrayItems(arrayTimings) – JIbber4568

+1

完美!非常感謝 – JIbber4568