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 pude 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"];
ios
objective-c
swift
immutability
mutable
Pranav Jaiswal
fuente
fuente
Dictionary
es verdaderamente inmutable (opuesto a Array)var
.Swift no tiene ningún reemplazo para
NSArray
las otras clases de colección en Objective-C.Hay clases de matriz y diccionario, pero debe tenerse en cuenta que se trata de tipos de "valor", en comparación con NSArray y NSDictionary, que son tipos de "objeto".
La diferencia es sutil pero puede ser muy importante para evitar errores de casos extremos.
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 NSMutableArray:
var myArray = ["a", "b", "c"] as NSMutableArray func addToArray(myArray: NSMutableArray) { myArray.addObject("d") } addToArray(myArray) myArray // ["a", "b", "c", "d"]
Puede lograr
NSMutableArray
el comportamiento de usando uninout
parámetro de método: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.
fuente
Solo hay uno
Array
y unDictionary
tipo 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 una constante, no lo es.
ADVERTENCIA: ¡Las matrices inmutables no son completamente inmutables! Aún puede cambiar su contenido, ¡pero no su longitud total!
fuente
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 obtener información más detallada
var myVariable = 42 myVariable = 50 let myConstant = 42
Lea "El lenguaje de programación Swift".
fuente
Si desea trabajar con
Array
(Swift) como conNSArray
, puede usar una función de puente simple. Ejemplo:var arr1 : Array = [] arr1.bridgeToObjectiveC().count
Funciona igual para
let
.fuente
De los propios documentos de Apple:
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105
Otros usos de las colecciones inmutables / mutables dependen de por qué desea que sean mutables / inmutables. Las colecciones son tipos de valor en Swift, lo que significa que su contenido se copia cuando se asigna a otro valor o se pasa a otra función / método. Por lo tanto, no necesita preocuparse por si una función del método de recepción podría 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.
fuente
[No modificable e inmutable]
La matriz de Swift se puede silenciar
[let vs var, valor vs tipo de referencia]
Colección inmutable [Acerca de] - es una estructura de colección que no se puede cambiar. Significa que no puede agregar, eliminar, modificar después de la creación.
let + struct
(comoArray
,Set
,Dictionary
) es más conveniente ser inmutableHay algunas clases (por ejemplo
NSArray
) que no proporcionan una interfaz para cambiar el estado internopero
class A { var value = "a" } func testMutability() { //given let a = A() let immutableArr1 = NSArray(array: [a]) let immutableArr2 = [a] //when a.value = "aa" //then XCTAssertEqual("aa", (immutableArr1[0] as! A).value) XCTAssertEqual("aa", immutableArr2[0].value) }
Preferiría ser una
unmodifiable
matrizfuente