¿Cómo usar removeObjectAtIndex de un Array en Swift?

swift

Para emplear el removeAtIndex, que permite eliminar un elemento contenido en un array, del cual no sabemos su índice, hay que hacer un par de maromas en Swift 1.2.

Veamos el código en Objective-c:

Objective-C:

[self.selectedRows removeObject:[NSNumber numberWithLong:indexPath.row]];

Resulta sencillo eliminar directamente de un array (selectedRows) de tipo mutable, es decir un NSMutableArray, un elemento contenido en él empleando removeObject.

¿Y qué tenemos que hacer en Swift?:

 

Swift:

Algo tan sencillo como emplear la función find (esto debido a que nuestro tipo es Array), donde indexPath.row es el objeto que vamos a eliminar del array selectedRows:

if let index = find(selectedRows, indexPath.row){
 selectedRows.removeAtIndex(index)
 }

¿Por qué resulta tan extraño realizar la misma tarea en Swift?. Primero hay que entender de qué tipo son los Array en Swift. ¿es un equivalente a NSArray?.  Según Apple, efectivamente nos cuenta que un Array es el equivalente a la clase NSArray de Foundation.

Swift’s Array type is bridged to Foundation’s NSArray class.

 

Así que, dado que los NSArray son inmutables, no es posible realizar un removeObject, ya que éste método le pertenece a NSMutableArray, sublcase de NSArray. Por lo que terminamos empleando un find para luego hacer un removeAtIndex.

Extension

Pero, esto no acaba aquí; para facilitarnos la vida cada vez que queramos eliminar de un Array en Swift, podemos incluso hacer algo mejor, crear una extensión -Ojo, también podríamos hacer mutable el Array empleando un NSMutableArray desde el principio, asumiendo que queremos eliminar o insertar objetos en él que para eso se usan los NSMutableArray, pero, así no aprenderíamos a hacer estas cositas, ¿no?-


import Foundation

extension Array {
   mutating func removeObject<T : Equatable>(object: T, array: [T]) { 
      if let index = find(array, object){
            self.removeAtIndex(index)
        }
    }
}

Nota que hemos tenido que emplear la opción Equatable T, lo que significa, que podemos recibir cualquier tipo (String, Integer, AnyObject) como objeto (el que terminaremos eliminando). Y puesto que find no funciona empleando self (cuyo tipo es un Array) si no especificamos concretamente que es un array con un tipo especifico, se lo pasamos por parámetro obligatoriamente por lo que empleamos [T]. Al mismo tiempo, nos encargamos de que la función find, si no encuentra nada no pase por la función self.removeAtIndex, lo que nos ahorra una Excepción.

También observamos que empleamos mutating al inicio de la función, lo que le permite realizar cambios en sus propiedades cada vez que se usa:

 if you need to modify the properties of your structure or enumeration within a particular method, you can opt in to mutating behavior for that method. The method can then mutate (that is, change) its properties from within the method, and any changes that it makes are written back to the original structure when the method ends.

 

Finalmente, ¿Cómo lo usamos?

var shoppingList: [String] = ["Eggs", "Milk"]
shoppingList.removeObject("Eggs", array: shoppingList)

Pues nada, ¡sigamos aprendiendo Swift!

 

Sofia Swidarowicz

I'm an iOS Software Engineer mostly. Known as phynet in the internez. I'm me, full of memory failure and lovely karma.

 

Leave a Reply

Your email address will not be published. Required fields are marked *