ios - Colecciones inmutables/mutables en Swift
objective-c immutability (7)
Arrays
Crear matriz inmutable
Primera forma:
let array = NSArray(array: ["First","Second","Third"])
Segunda forma:
let array = ["First","Second","Third"]
Crear matriz mutable
var array = ["First","Second","Third"]
Añadir objeto a matriz
array.append("Forth")
Diccionarios
Crear diccionario inmutable
let dictionary = ["Item 1": "description", "Item 2": "description"]
Crear diccionario mutable
var dictionary = ["Item 1": "description", "Item 2": "description"]
Añadir un nuevo par al diccionario
dictionary["Item 3"] = "description"
Me refería a la guía de programación Swift de Apple para comprender la creación de objetos mutables / inmutables (matriz, diccionario, conjuntos, datos) en lenguaje Swift. Pero no puedo entender cómo crear colecciones inmutables en Swift.
Me gustaría ver los equivalentes en Swift para lo siguiente en Objective-C
Matriz inmutable
NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
Matriz mutable
NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];
Diccionario inmutable
NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
Diccionario mutable
NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];
De los propios documentos de Apple:
Mutabilidad de colecciones
Si crea una matriz, un conjunto o un diccionario y lo asigna a una variable, la colección que se crea será mutable. Esto significa que puede cambiar (o modificar) la colección después de que se crea agregando, eliminando o cambiando elementos en la colección. Por el contrario, si asigna una matriz, un conjunto o un diccionario a una constante, esa colección es inmutable y su tamaño y contenido no pueden modificarse.
Otros usos de colecciones inmutables / mutables dependen del motivo por el que desea que sean mutables / inmutables. Las colecciones son tipos de valores en Swift, lo que significa que sus contenidos se copian cuando se asignan a otro valor o se pasan a otra función / método. Por lo tanto, no necesita preocuparse acerca de si una función de método de recepción puede cambiar la matriz original. Por lo tanto, no necesita asegurarse de devolver una colección inmutable si su clase tiene una colección mutable, por ejemplo.
No hay un elenco incorporado para esto. Pero en su lugar puede usar el inicializador de NSMutableDictionary que toma un diccionario:
var foundationDictionary = NSMutableDictionary(dictionary: dictionary)
Si desea trabajar con Array
(Swift) como con NSArray
, puede usar una función de puente simple. Ejemplo:
var arr1 : Array = []
arr1.bridgeToObjectiveC().count
Funciona igual para let
.
Simplemente declare su (cualquier) objeto o variable con
''let'' key word -> for "constan/Immutable" array, dictionary, variable, object..etc.
y
''var'' key word -> for "Mutable" array, dictionary, variable, object..etc.
Para más información
"Use let para hacer una constante y var para hacer una variable. El valor de una constante no necesita conocerse en tiempo de compilación, pero debe asignarle un valor exactamente una vez. Esto significa que puedes usar constantes para nombrar un valor que determinas una vez pero que utilizas en muchos lugares ".
var myVariable = 42
myVariable = 50
let myConstant = 42
Solo hay un Array
y un tipo de Dictionary
en Swift. La mutabilidad depende de cómo la construyas:
var mutableArray = [1,2,3]
let immutableArray = [1,2,3]
es decir, si crea una asignación a una variable, es mutable, mientras que si crea una asignación a constante, no lo es.
ADVERTENCIA: ¡Las matrices inmutables no son completamente inmutables! ¡Todavía puedes cambiar sus contenidos, pero no su longitud total!
Swift no tiene ningún reemplazo en reemplazo de NSArray
o las otras clases de colección en Objective-C.
Hay clases de matriz y diccionario, pero debe tenerse en cuenta que son tipos de "valor", en comparación con NSArray y NSDictionary, que son tipos de "objetos".
La diferencia es sutil, pero puede ser muy importante para evitar errores en el borde del caso.
Rápidamente, crea una matriz "inmutable" con:
let hello = ["a", "b", "c"]
Y una matriz "mutable" con:
var hello = ["a", "b", "c"]
Las matrices mutables se pueden modificar como NSMutableArray
:
var myArray = ["a", "b", "c"]
myArray.append("d") // ["a", "b", "c", "d"]
Sin embargo, no puede pasar una matriz mutable a una función:
var myArray = ["a", "b", "c"]
func addToArray(myArray: [String]) {
myArray.append("d") // compile error
}
Pero el código anterior funciona con un NSMutableArray:
var myArray = ["a", "b", "c"] as NSMutableArray
func addToArray(myArray: NSMutableArray) {
myArray.addObject("d")
}
addToArray(myArray)
myArray // ["a", "b", "c", "d"]
Puede lograr el comportamiento de inout
utilizando un parámetro de método inout
:
var myArray = ["a", "b", "c"]
func addToArray(inout myArray: [String]) {
myArray.append("d")
}
addToArray(&myArray)
myArray // ["a", "b", "c", "d"]
Reescribió esta respuesta 2015-08-10 para reflejar el comportamiento actual de Swift.