2015-05-21 3 views
0

Я пытаюсь написать расширение массива, которое позволит мне удалить элементы из массива, если они существуют в другом массиве. Мне нужно будет использовать это для ряда пользовательских типов, поэтому пыталась создать нечто общее.Удалить элементы массива из массива

Это то, что я до сих пор, который возвращает ошибку «бинарный оператор == не может быть применен к двум операндам т» оператор

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

Обратите внимание, что если вы определяете свои собственные типы, такие как с class или struct ваши типы также должны соответствовать Equatable. Пример:

class Foo : Equatable { 
    // ... 
} 

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

Отлично! Большое спасибо за это. Получил это компиляцию сейчас. Однако проблема, которую я до сих пор имею, - это не похоже на то, что я называю это массивами пользовательского типа. Тем не менее, он работает на ваших стандартных типах. , например. var arrayTimings: [Timing] = [Timing]() // Заполнение массива scheduleTimings.removeArrayItems (arrayTimings) – JIbber4568

+1

Perfect! Большое спасибо мату – JIbber4568

Смежные вопросы