Menu
Coddy logo textTech

Solo lectura desde fuera

Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 18 de 57.

A menudo, el código externo debería leer una propiedad, pero no cambiarla. private(set) mantiene el getter en el nivel normal y hace que solo el setter sea privado:

struct Counter {
    private(set) var count = 0

    mutating func increment() {
        count += 1
    }
}

var c = Counter()
c.increment()
print(c.count)
// c.count = 99   // error: el setter es privado

Salida:

1

Esto se aplica a valores que solo deben cambiar mediante una regla, como una puntuación que solo aumenta mediante acciones válidas:

class Player {
    let name: String
    private(set) var score = 0
    private(set) var history: [Int] = []

    init(name: String) { self.name = name }

    func award(_ points: Int) {
        guard points > 0 else { return }
        score += points
        history.append(points)
    }
}

let p = Player(name: "Ada")
p.award(10)
p.award(-5)
p.award(3)
print(p.score)
print(p.history)

Salida:

13
[10, 3]

Una propiedad let es de solo lectura para todos una vez que existe la instancia, incluidos los propios métodos del tipo. private(set) var sigue siendo modificable dentro del tipo. Elige let para los valores que nunca cambian después de la creación:

class Order {
    let id: Int                 // nunca cambia
    private(set) var status = "new"   // cambia, pero solo dentro de Order
    init(id: Int) { self.id = id }
    func ship() { status = "shipped" }
}

Una propiedad calculada de solo lectura es otra forma de exponer información sin permitir cambios, porque no tiene ningún setter:

struct Cart {
    private var prices: [Int] = []
    var total: Int { prices.reduce(0, +) }
    var count: Int { prices.count }

    mutating func add(_ price: Int) { prices.append(price) }
}

var cart = Cart()
cart.add(4)
cart.add(6)
print("\(cart.count) items, total \(cart.total)")

Salida:

2 items, total 10
challenge icon

Desafío

Fácil

Completa la clase Elevator. floor y trips se pueden leer desde fuera, pero solo la clase puede modificarlos (private(set)). goTo(_:) se desplaza entre el piso 0 y topFloor: un desplazamiento válido a un piso diferente actualiza floor, suma 1 a trips y devuelve true; un desplazamiento no válido o al mismo piso devuelve false.

El código proporcionado lee el piso superior y después los pisos de destino. Imprime floor 3 después de un desplazamiento o stay 3 cuando se rechaza el desplazamiento, y finalmente trips: con el recuento.

Tu código debe ir en Elevator.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

// Código de entrada/salida suministrado: déjalo como está
var input: [String] = []
while let line = readLine() { input.append(line) }
let lift = Elevator(topFloor: Int(input[0])!)
for line in input.dropFirst() {
    let moved = lift.goTo(Int(line)!)
    print("\(moved ? "floor" : "stay") \(lift.floor)")
}
print("trips: \(lift.trips)")
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Playground de Swift