Del libro de Apple "Una de las diferencias más importantes entre estructuras y clases es que las estructuras siempre se copian cuando se pasan en su código, pero las clases se pasan por referencia".
¿Alguien puede ayudarme a entender lo que eso significa? Para mí, las clases y las estructuras parecen ser las mismas.
void my_func(int a)
vsvoid my_func(int &a)
. Esta es una cuestión muy fundamental de programación. Leer más: stackoverflow.com/questions/373419/…Respuestas:
Aquí hay un ejemplo con a
class
. Tenga en cuenta que cuando se cambia el nombre, se actualiza la instancia a la que hacen referencia ambas variables.Bob
es ahoraSue
, en todas partes queBob
alguna vez se hizo referencia.Y ahora con un
struct
vemos que los valores se copian y cada variable mantiene su propio conjunto de valores. Cuando establecemos el nombre enSue
, laBob
estructuraaStruct
no cambia.Entonces, para representar una entidad compleja con estado, a
class
es increíble. Pero para los valores que son simplemente una medida o bits de datos relacionados, astruct
tiene más sentido para que pueda copiarlos fácilmente y calcular con ellos o modificar los valores sin temor a los efectos secundarios.fuente
aStruct and bStruct are two structs with the same value!
Esto me confunde ya que los valores de las variables dentro de la estructura son diferentes.aStruct
ybStruct
tienen valores idénticos. Ambos tienen un soloname
campo que se establece"Bob"
. Pero son dos estructuras diferentes. Esto se demuestra en la siguiente línea cuando puede cambiar el nombre de una de las estructuras, y la otra permanece sin cambios.Tanto la clase como la estructura pueden hacer:
Solo la clase puede hacer:
fuente
struct
son tipos de valor Significa que si copia la instancia de la estructura a otra variable, solo se copia a la variable.Ejemplo para tipo de valor
Las clases son tipos de referencia. Significa que si asigna una instancia de la clase a una variable, contendrá solo la referencia a la instancia y no la copia .
fuente
Las respuestas anteriores son correctas. Espero que mi respuesta ayude a alguien que no entiende las respuestas anteriores.
Bien en Swift Hay dos tipos de objetos.
La principal diferencia entre ellos es
Por ejemplo, aquí código para entender bien.
Esta fue la principal diferencia, pero también tenemos diferencias secundarias.
Clase
Estructura
fuente
Esta pregunta parece estar duplicada, pero independientemente, lo siguiente respondería la mayoría de los casos de uso:
Una de las diferencias más importantes entre estructuras y clases es que las estructuras son tipos de valor y siempre se copian cuando se pasan en su código, y las clases son de tipo de referencia y se pasan por referencia.
Además, las clases tienen herencia que permite que una clase herede las características de otra.
Las propiedades de estructura se almacenan en la pila y las instancias de clase se almacenan en el montón, por lo tanto, a veces la pila es drásticamente más rápida que una clase.
Struct obtiene un inicializador predeterminado automáticamente, mientras que en Class, tenemos que inicializar.
Struct es seguro para subprocesos o singleton en cualquier momento.
Y también, para resumir la diferencia entre estructuras y clases, es necesario comprender la diferencia entre el valor y los tipos de referencia.
// sampleplayground.playground
Salida:
fuente
Si busca más en el manual de Apple, verá esta sección: "Las estructuras y las enumeraciones son tipos de valor"
En esta sección verá esto:
Esta es la mayor diferencia entre estructuras y clases. Las estructuras se copian y se hace referencia a clases.
fuente
Por lo general (en la mayoría de los lenguajes de programación), los objetos son bloques de datos que se almacenan en el montón, y luego una referencia (normalmente un puntero) a estos bloques, contiene un
name
uso para acceder a estos bloques de datos. Este mecanismo permite compartir objetos en el montón copiando el valor de sus referencias (punteros). Este no es el caso de los tipos de datos básicos, como los enteros, y eso se debe a que la memoria necesaria para crear una referencia es casi la misma que el objeto (en este caso, el valor entero). Por lo tanto, se pasarán como valores, no como referencia en el caso de objetos grandes.Swift usa struct para mejorar el rendimiento incluso con objetos String y Array.
Una muy buena lectura aquí
fuente
Para comprender la diferencia entre estructuras y clases, necesitamos conocer la diferencia principal entre el valor y los tipos de referencia. Las estructuras son tipos de valor y eso significa que cada cambio en ellas solo modificará ese valor, las clases son tipos de referencia y cada cambio en un tipo de referencia modificará el valor asignado en ese lugar de memoria o referencia. Por ejemplo:
Comencemos con una clase, esta clase se ajusta a Equatable solo para poder comparar instancias, creamos una instancia llamada
pointClassInstanceA
y otra llamadapointClassInstanceB
asignamos clase A a clase B, ahora la afirmación dice que son lo mismo ...Ok, ¿qué pasó aquí por qué si solo cambiamos el valor x de pointsClassInstanceB también cambia el valor x de pointClassInstanceA? bueno, esto muestra cómo funcionan los tipos de referencia, cuando asignamos la instancia A, como un valor de la instancia B y luego modificamos X de uno de ellos, cambiará ambas X porque comparten la misma referencia y lo que cambió fue el valor de esa instancia referencia.
Hagamos lo mismo pero con una estructura
Básicamente tenemos la misma estructura que nuestra clase, pero ahora puede ver que cuando imprime el valor x de pointStructInstanceA en este caso no cambió, y esto se debe a que los tipos de valor funcionan de manera diferente y cada cambio en una de sus instancias será " independiente "y no afectará al otro.
Swift sugiere utilizar más tipos de valores y puede darse cuenta de que sus bibliotecas se basan en estructuras para evitar los problemas que traen los tipos de referencia, como modificar involuntariamente un valor, etc. Las estructuras son el camino a seguir en Swift. Espero eso ayude.
fuente
Aquí hay un ejemplo que muestra la diferencia entre struct y class con precisión.
captura de pantalla del código escrito en el patio de recreo
fuente
fuente
Tipos rápidos
Tipo de valor :
Struct
,Enum
,Tuple
struct String
,struct Array
(Set
,Dictionary
)value type
una nueva copia de datos se crea. En realidad, el mecanismocopy on write
-COW
se usa con algunas optimizaciones, por ejemplo, la copia se crea cuando se modifica el objetoTipo de referencia :
Class
,Function
reference type
una nueva referencia a la instancia original, se creará (se copia la dirección de la instancia).Value type
se recomienda usar por defecto . La mayor ventaja deValue type
es que generalmente sonthread safe
Reference type
Pros:deinit()
puede ser usado,===
,Objective-C
interoperabilidad porqueValue Type
se introdujo en Swift.[Más sobre mutabilidad]
Elección entre estructuras y clases
Tipos
Clases y estructuras
fuente
Ya hay mucho escrito sobre esto, me gustaría agregar una analogía allí. Espero que nunca tenga dudas en mente después de esto: Conclusión: las clases se pasan por referencia mientras que las estructuras se pasan por valor.
Supongamos que está compartiendo una hoja de documentos de Google con su amigo. Ahora, si cambia algo en eso, también verá que los cambios en su documento de Google, significa que su copia también se ve afectada. Eso es básicamente " aprobado por referencia ".
Pero suponga, si tiene un archivo .XLS guardado en su máquina. Proporcionas ese archivo para darle a tu amigo. Ahora, si está haciendo algún cambio en ese archivo, su archivo no se verá afectado / afectado porque tiene su propia copia. Eso es básicamente " pasado por valor ". Ya tiene varios programas simples para verificar esta analogía en áreas de juego rápidas.
fuente