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 privadoSalida:
1Esto 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 10Desafío
FácilCompleta 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)")
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
1Clases y objetos
Trabajar con archivosDefinir clasesMétodos y selfInicializadoresLas clases son referenciasRepaso: tarjeta de biblioteca4Encapsulación
Control de accesoSolo lectura desde fueraProtección del estadoInicializadores que pueden fallarRepaso - Cuenta bancaria7Polimorfismo y genéricos
PolimorfismoConversión de tiposFunciones genéricasTipos genéricosRepaso - Calculadora de formas2Structs y tipos por valor
StructsSemántica de valoresMétodos mutablesStruct o claseRepaso - elemento del inventario5Herencia
SubclasesSobrescritura de métodosInicializadores y superfinal y jerarquíasRepaso: jerarquía de empleados8Protocolos estándar
CustomStringConvertibleEquatableComparableHashableRepaso - Ordenamiento personalizado11Proyecto: Gestión de bibliotecas
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Swift