Sobes.tech
Junior

¿Cuál es la diferencia entre estructuras y clases en Swift?

sobes.tech AI

Respuesta de la IA

Diferencias principales:

  • Tipo de valor vs. Tipo de referencia: Las estructuras son tipos de valor, las clases son tipos de referencia. Al asignar una estructura o pasarla a una función, se copia el valor. Al asignar una clase o pasarla a una función, se copia la referencia a un bloque de memoria.
  • Herencia: Las estructuras no soportan herencia. Las clases soportan herencia, permitiendo crear jerarquías de objetos.
  • Desinicializadores: Las estructuras no tienen desinicializadores. Las clases pueden tener un desinicializador (deinit) para liberar recursos.
  • Igualdad de identidad: Para las estructuras, se compara el valor de todas sus propiedades (por defecto usando ==). Para las clases, == por defecto compara referencias (identidad).
  • Rendimiento: Las estructuras suelen ser más eficientes al trabajar con pequeños volúmenes de datos, ya que no utilizan asignación dinámica en el montón y no tienen costos adicionales por conteo de referencias (ARC).
Criterio Estructura (Struct) Clase (Class)
Tipo Valores (Tipo de valor) Referencias (Tipo de referencia)
Herencia No
Desinicializadores No Sí (deinit)
Igualdad de identidad Comparación por valor Comparación por referencia
Ubicación Usualmente en pila (para variables locales) En montón
ARC No

La elección entre estructura y clase depende de las necesidades. Las estructuras son adecuadas para modelar datos donde la transferencia por valor es importante (por ejemplo, coordenadas, tamaño). Las clases se usan cuando se requiere herencia, una referencia mutable compartida a un objeto o gestión del ciclo de vida del recurso.

// Ejemplo de estructura
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 0.0, y: 0.0)
var p2 = p1 // p2 es una copia de p1
p2.x = 5.0

// p1.x sigue siendo 0.0
print("p1.x: \(p1.x), p2.x: \(p2.x)")

// Ejemplo de clase
class Circle {
    var radius: Double
    init(radius: Double) {
        self.radius = radius
    }
    deinit {
        print("La instancia de Circle se está desinicializando.")
    }
}

var c1 = Circle(radius: 1.0)
var c2 = c1 // c2 referencia a la misma instancia que c1
c2.radius = 10.0

// c1.radius también se vuelve 10.0
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)")

// Comparación de identidad
if c1 === c2 { // Compara referencias
    print("c1 y c2 se refieren a la misma instancia de Circle.")
} else {
    print("c1 y c2 no se refieren a la misma instancia de Circle.")
}

// Comparación de valores (para estructuras)
let p3 = Point(x: 0.0, y: 0.0)
if p1 == p3 { // Compara los valores de todas las propiedades
    print("p1 y p3 tienen el mismo valor.")
} else {
    print("p1 y p3 no tienen el mismo valor.")
}