La diferencia importa al diseñar librerÃas. public expone el tipo pero impide que el usuario lo subclasifique o sobreescriba sus métodos. open permite ambas cosas. La regla: usa public por defecto para APIs de librerÃa y solo open cuando quieras que el usuario extienda el comportamiento:
// LibrerÃa
public class Motor {
public func arrancar() {}
open func configurar() {} // extensible por el usuario
}
// Módulo del usuario
class MotorTurbo: Motor {
override func configurar() { super.configurar() }
// override func arrancar() {} // Error: 'arrancar' no es open
}
private(set): solo escritura privada
public struct Contador {
public private(set) var valor = 0 // lectura publica, escritura privada
public mutating func incrementar() { valor += 1 }
}
var c = Contador()
c.incrementar()
print(c.valor) // 1
// c.valor = 99 // Error: setter privado
