Eliminar un object personalizado de una matriz (Swift)

Tengo una matriz llamada remindersArray que contiene un object personalizado llamado Reminder (cada object Reminder tiene title e identifier ).

Inside Reminder tengo una diversión estática llamada removeReminderWithIdentifier que debería encontrar el recordatorio y eliminarlo de la matriz.

He intentado hacerlo así:

 static func removeReminderWithIdentifier(reminderIdentifier: String) { for currentReminder in Reminder.remindersArray { if currentReminder.identifier == reminderIdentifier { Reminder.remindersArray.removeAtIndex(Reminder.remindersArray.indexOf(currentReminder)) //Compile error } } } 

pero me da este error de compilation:

 Cannot convert value of type 'Reminder' to expected argument type '@noescape (Reminder) throws -> Bool' 

¿Alguna idea de cómo puedo eliminar ese object con este identificador de la matriz?

¡Gracias!

Vea el encabezado de dos indexOf(_:) para CollectionType :

 extension CollectionType where Generator.Element : Equatable { /// Returns the first index where `value` appears in `self` or `nil` if /// `value` is not found. /// /// - Complexity: O(`self.count`). @warn_unused_result public func indexOf(element: Self.Generator.Element) -> Self.Index? } extension CollectionType { /// Returns the first index where `pnetworkingicate` returns `true` for the /// corresponding value, or `nil` if such value is not found. /// /// - Complexity: O(`self.count`). @warn_unused_result public func indexOf(@noescape pnetworkingicate: (Self.Generator.Element) throws -> Bool) rethrows -> Self.Index? } 

Si desea utilizar el primer indexOf(_:) (que está intentando en su código), el tipo de elemento debe ser Equatable . Cuando su class Reminder no se ajusta a Equatable , Swift ignora el primer indexOf(_:) , por lo que el segundo puede ser el único candidato, teniendo @noescape (Self.Generator.Element) throws -> Bool como su único argumento. En su caso, Self.Generator.Element es Reminder .

Por lo tanto, una forma de evitar este error es hacer que su Reminder ajuste a Equatable .

 extension Reminder: Equatable {} func == (lhs: Reminder, rhs: Reminder) -> Bool { return lhs.identifier == rhs.identifier /* && ... you may need more complex condition. */ /* return lhs === rhs //or simple use `===`. */ } 

Pero tiene algunas opciones para hacerlo:

Si su reminderArray contiene solo un elemento para cada identifier único, puede escribir algo como esto, sin hacer su Reminder Equatable :

 static func removeReminderWithIdentifier(reminderIdentifier: String) { if let index = Reminder.remindersArray.indexOf({$0.identifier == reminderIdentifier}) { Reminder.remindersArray.removeAtIndex(index) } } 

Si su remindersArray puede contener varias instancias de Reminder tengan el mismo identifier , esto debería funcionar:

 static func removeReminderWithIdentifier3(reminderIdentifier: String) { Reminder.remindersArray = Reminder.remindersArray.filter{$0.identifier != reminderIdentifier} } 

Elija uno (¿o más?) Y pruébelo.

Puede filtrar los recordatorios no deseados:

 static func removeReminderWithIdentifier(reminderIdentifier: String) { Reminder.remindersArray = Reminder.remindersArray.filter { $0.identifier != reminderIdentifier } } 

Alternativamente:

 func removeReminderWithIdentifier(reminderIdentifier: String) { remindersArray = remindersArray.filter { $0.identifier != reminderIdentifier } } 

Y en el último estilo de nomenclatura rápida …:

 func removeReminders(with identifier: String) { remindersArray = remindersArray.filter { $0.identifier != identifier } }