ios objective-c swift immutability mutable

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"

Más información sobre desarrollador de Apple

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.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105

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

Lea "El lenguaje de programación Swift".


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.