La única diferencia que se tiene entre una Estructura y una Clase, es que las Estructuras no se pueden heredar.
Me gustaría agregar otra diferencia entre Estructuras y Clases que considero MUY IMPORTANTE, y ésta es, el cómo son copiados/tratados por el compilador en memoria. Ésto es:
class: Copia por referencia.
struct: Copia por valor.
¿Cómo nos impácta ésto?
Para demostrarlo, declaremos una clase llamada ClaseRectangulo, y una estructura llamada EstructuraRectangulo, ambas con basicamente la misma definición.
// creamos `claseRectangulo1`let claseRectangulo1 =ClaseRectangulo(base:2,altura:1)// imprimimos el Retain Count de `claseRectangulo1`print("Retain Count de claseRectangulo1:",CFGetRetainCount(claseRectangulo1))// imprimimos el valor de `claseRectangulo1`print(claseRectangulo1)// creamos `claseRectangulo2` a partir de `claseRectangulo1` (copia por referencia)let claseRectangulo2 = claseRectangulo1
// imprimimos el Retain Count de `claseRectangulo1` (incrementado en 1)print("Retain Count de claseRectangulo1:",CFGetRetainCount(claseRectangulo1))// modificamos `claseRectangulo2`claseRectangulo2.altura=5// de nuevo imprimimos el valor de `claseRectangulo1` (modificados al modificar `claseRectangulo2`)print(claseRectangulo1)// imprimimos `claseRectangulo2` quien tendrá el mismo valor que `claseRectangulo1`print(claseRectangulo2)
output:
RetainCount de claseRectangulo1:2CLASE::Base:2.0,Altura:1.0RetainCount de claseRectangulo1:3CLASE::Base:2.0,Altura:5.0CLASE::Base:2.0,Altura:5.0
Estructura:
// creamos `estructuraRectangulo1`var estructuraRectangulo1 =EstructuraRectangulo(base:2,altura:1)// imprimimos el Retain Count de `estructuraRectangulo1`print("Retain Count de estructuraRectangulo1:",CFGetRetainCount(estructuraRectangulo1 asCFTypeRef))// imprimimos el valor de `estructuraRectangulo1`print(estructuraRectangulo1)// creamos `estructuraRectangulo2` a partir de `estructuraRectangulo1` (copia por valor)var estructuraRectangulo2 = estructuraRectangulo1
// imprimimos el Retain Count de `estructuraRectangulo1` (NO se incrementa)print("Retain Count de estructuraRectangulo1:",CFGetRetainCount(estructuraRectangulo1 asCFTypeRef))// modificamos `estructuraRectangulo2`estructuraRectangulo2.altura=5// de nuevo imprimimos el valor de `estructuraRectangulo1`print(estructuraRectangulo1)// imprimimos el valor de `estructuraRectangulo2` (diferente de `estructuraRectangulo1` ya que fué copia por valor)print(estructuraRectangulo2)
output:
RetainCount de estructuraRectangulo1:1ESTRUCTURA::Base:2.0,Altura:1.0RetainCount de estructuraRectangulo1:1ESTRUCTURA::Base:2.0,Altura:1.0ESTRUCTURA::Base:2.0,Altura:5.0
En resumen:
Debemos tener cuidado a la hora de trabajar en el diseño de nuestras aplicaciones, para saber si debemos usar Estructuras o Clases. Ésto nos impactará en el memory management, y si no se tiene cuidado podríamos generar memory leaks en nuestra app, y también nos podría impactar en la integridad de los datos, al trabajar con referencias donde no se debería podríamos alterar/modificar información donde no se debe.