objective c - sistema - ¿Las referencias a instancias realmente funcionan en Swift?
swift versions (3)
Primero escribí el código Objective-C
NSMutableString *aStrValue = [NSMutableString stringWithString:@"Hello"];
NSMutableDictionary *aMutDict = [NSMutableDictionary dictionary];
[aMutDict setObject:aStrValue forKey:@"name"];
NSLog(@"Before %@",aMutDict);
[aStrValue appendString:@" World"];
NSLog(@"After %@",aMutDict);
Obtuve el resultado de la siguiente manera
2015-09-17 14:27:21.052 ShareIt[4946:129853] Before {
name = Hello;
}
2015-09-17 14:27:21.057 ShareIt[4946:129853] After {
name = "Hello World";
}
Significa que cuando agrego una cadena a una cadena Mutable que en realidad se refiere a un MutableDictionary, el cambio también se refleja en Dictionary.
Pero luego probé algo igual en Swift
var stringValue:String?
stringValue = "Hello"
var dict:Dictionary = ["name":stringValue!]
println(dict)
stringValue! += " World"
stringValue!.extend(" !!!!")
println(dict)
Vi la salida en el patio de recreo como este
Mis preguntas son
- Por qué el valor que cambió no se refleja en una estructura de datos como Dictionary.
- ¿En SWIFT, agregar cualquier valor clave realmente conserva el valor o su referencia, si mantiene la referencia como objetivo-C, entonces, ¿cuál es mi error?
Tipo de referencia
Los diferentes comportamientos dependen del hecho de que en el código Objective-C use NSMutableString
que es una class
. Esto significa que aMutDict
y aStrValue
son referencias al mismo objeto del tipo NSMutableString
. Por lo tanto, los cambios que aplique utilizando aStrValue
son visibiles por aMutDict
.
Tipo de valor
Por otro lado en Swift estás usando la struct
String
. Este es un tipo de valor . Esto significa que cuando copias el valor de una variable a otra, el cambio que haces usando la primera variable no es visible para la segunda.
El siguiente ejemplo describe claramente el comportamiento del value type
:
var word0 = "Hello"
var word1 = word0
word0 += " world" // this will NOT impact word1
word0 // "Hello world"
word1 // "Hello"
Espero que esto ayude.
Las cadenas en Swift (copia por valor) son completamente diferentes a la cadena en el Objetivo C (copiar por referencia).
De la documentación de Swift de Apple:
Las cadenas son tipos de valores
El tipo de cadena de Swift es un tipo de valor. Si crea un nuevo valor de cadena, ese valor de cadena se copia cuando se pasa a una función o método, o cuando se asigna a una constante o variable. En cada caso, se crea una nueva copia del valor de cadena existente, y la nueva copia se pasa o se asigna, no la versión original. Los tipos de valores se describen en Estructuras y Enumeraciones son Tipos de valores.
El comportamiento de cadena de Copia por defecto de Swift asegura que cuando una función o método le transfiere un valor de Cadena, es claro que posee ese valor de Cadena exacto, independientemente de su origen. Puede estar seguro de que la secuencia que le pase no se modificará a menos que la modifique usted mismo.
Detrás de escena, el compilador de Swift optimiza el uso de cadenas para que la copia real se realice solo cuando sea absolutamente necesario. Esto significa que siempre obtiene un gran rendimiento cuando trabaja con cadenas como tipos de valores.
Rápidamente, String es una Struct. Las estructuras no son tipos de referencia en Swift, por lo tanto, se copian cuando lo configura en un diccionario.