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’sNSArray
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:
Finalmente, ¿Cómo lo usamos?
var shoppingList: [String] = ["Eggs", "Milk"]
shoppingList.removeObject("Eggs", array: shoppingList)
Pues nada, ¡sigamos aprendiendo Swift!