Sola lettura dall’esterno
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 18 di 57.
Spesso il codice esterno dovrebbe poter leggere una proprietà, ma non modificarla. private(set) mantiene il getter al livello normale e rende privato solo il setter:
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 privadoOutput:
1È adatto a valori che devono cambiare solo in base a una regola, come un punteggio che aumenta solo in seguito ad azioni valide:
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)Output:
13
[10, 3]Una proprietà let è di sola lettura per tutti una volta che l’istanza esiste, compresi i metodi propri del tipo. private(set) var rimane modificabile all’interno del tipo. Scegli let per i valori che non cambiano mai dopo la creazione:
class Order {
let id: Int // non cambia mai
private(set) var status = "new" // cambia, ma solo all'interno di Order
init(id: Int) { self.id = id }
func ship() { status = "shipped" }
}Una proprietà calcolata di sola lettura è un altro modo per esporre informazioni senza consentire modifiche, perché non ha affatto un 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)")Output:
2 items, total 10Sfida
FacileCompleta la classe Elevator. floor e trips possono essere letti dall'esterno, ma possono essere modificati solo dalla classe (private(set)). goTo(_:) si sposta tra il piano 0 e topFloor: uno spostamento valido verso un piano diverso aggiorna floor, aggiunge 1 a trips e restituisce true; uno spostamento non valido o verso lo stesso piano restituisce false.
Il codice fornito legge il piano più alto e poi i piani di destinazione. Stampa floor 3 dopo uno spostamento oppure stay 3 quando lo spostamento viene rifiutato, e infine trips: con il conteggio.
Il tuo codice va in Elevator.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
// Código de entrada/salida proporcionado: mantenlo tal 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)")
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiMetodi e selfInizializzatoriLe classi sono riferimentiRiepilogo - Tessera della biblioteca4Incapsulamento
Controllo degli accessiSola lettura dall’esternoProteggere lo statoInizializzatori che possono fallireRiepilogo - Conto bancario7Polimorfismo e tipi generici
PolimorfismoCasting dei tipiFunzioni genericheTipi genericiRipasso - Calcolatore di forme2Struct e tipi valore
Le structSemantica dei valoriMetodi mutantiStruct o classeRiepilogo - Articolo di inventario5Ereditarietà
SottoclassiSovrascrivere i metodiInizializzatori e superfinal e gerarchieRiepilogo - Gerarchia dei dipendenti8Protocolli standard
CustomStringConvertibleEquatableComparableHashableRiepilogo - Ordinamento personalizzato11Progetto: Gestione della biblioteca
Libri e utentiPrestito dei libriEsercitati da solo: Playground Swift