Proprietà calcolate
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 12 di 57.
Una proprietà memorizzata contiene un valore. Una proprietà calcolata non ha memoria: esegue il codice ogni volta che viene letta e restituisce un valore calcolato da altre proprietà:
struct Rectangle {
var width: Double
var height: Double
var area: Double {
width * height
}
}
var r = Rectangle(width: 3, height: 4)
print(r.area)
r.width = 10
print(r.area)Output:
12.0
40.0Poiché il valore viene ricalcolato a ogni lettura, una proprietà calcolata non può mai essere obsoleta. Si legge come una proprietà memorizzata, senza parentesi:
struct Person {
var first: String
var last: String
var fullName: String {
"\(first) \(last)"
}
}
var p = Person(first: "Ada", last: "Byron")
p.last = "Lovelace"
print(p.fullName)Output:
Ada LovelaceUna proprietà calcolata può avere anche un setter. set riceve il nuovo valore come newValue e aggiorna le proprietà memorizzate da cui dipende:
struct Temperature {
var celsius: Double
var fahrenheit: Double {
get { celsius * 9 / 5 + 32 }
set { celsius = (newValue - 32) * 5 / 9 }
}
}
var t = Temperature(celsius: 100)
print(t.fahrenheit)
t.fahrenheit = 32
print(t.celsius)Output:
212.0
0.0Usa una proprietà calcolata per un valore che deriva da altri ed è facile da calcolare. Usa un metodo quando il lavoro richiede argomenti o è costoso:
struct Order {
var items: [Int]
var total: Int { items.reduce(0, +) } // proprietà: nessun argomento
func total(withTax rate: Int) -> Int { // metodo: accetta un argomento
total + total * rate / 100
}
}Sfida
FacileCompleta la struct Circle con una proprietà memorizzata radius e tre proprietà calcolate di sola lettura: diameter (il doppio del raggio), area (π r², usando Double.pi) e label, che restituisce r=2.0 d=4.0 a=12.57 con l’area arrotondata a due decimali usando String(format: "%.2f", area).
Il codice fornito legge un raggio per riga, crea un Circle e stampa label. Poi raddoppia il raggio dell’ultimo cerchio e stampa di nuovo il suo label, quindi i valori devono seguire il raggio.
Il tuo codice va in Circle.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
import Foundation
// Codice di input/output fornito: lascialo così com'è
var input: [String] = []
while let line = readLine() { input.append(line) }
var last = Circle(radius: 0)
for line in input {
last = Circle(radius: Double(line)!)
print(last.label)
}
last.radius *= 2
print(last.label)
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 libri3Le proprietà in dettaglio
Proprietà calcolateObserver delle proprietàMembri staticiEnum con metodiRiepilogo - Registro delle temperatureEsercitati da solo: Playground Swift