Membri statici
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 14 di 57.
Una proprietà static appartiene al tipo stesso, non a una sua istanza. Esiste una sola copia, accessibile tramite il nome del tipo:
struct Temperature {
static let freezing = 0.0
static let boiling = 100.0
var celsius: Double
}
print(Temperature.boiling - Temperature.freezing)Output:
100.0Una static var può cambiare, il che la rende utile per i dati condivisi da tutte le istanze, come un contatore del numero di istanze create:
class Ticket {
static var issued = 0
let number: Int
init() {
Ticket.issued += 1
number = Ticket.issued
}
}
let a = Ticket()
let b = Ticket()
print(a.number)
print(b.number)
print(Ticket.issued)Output:
1
2
2Una static func viene chiamata sul tipo. Non ha un'istanza self con cui lavorare, quindi usa solo i suoi argomenti e altri membri statici. È un buon posto per gli helper e per i metodi con nome che creano istanze:
struct Color {
var red: Int
var green: Int
var blue: Int
static func gray(_ level: Int) -> Color {
Color(red: level, green: level, blue: level)
}
}
let c = Color.gray(128)
print(c.red + c.green + c.blue)Output:
384All'interno del tipo, Self è un altro modo per indicare il tipo, quindi i membri statici possono essere scritti come Self.issued. I metodi di istanza possono leggere i membri statici, ma un metodo statico non può leggere le proprietà di istanza, perché non viene chiamato su un'istanza.
struct Level {
static let maximum = 10
var current = 1
func isMax() -> Bool { current == Self.maximum } // il metodo di istanza legge static
static func describe() -> String { "levels 1-\(maximum)" } // il metodo static legge static
}Sfida
FacileCompleta la classe Order. Una proprietà statica nextId inizia da 1 e ogni nuovo ordine usa il valore corrente di nextId come id e lo incrementa. Una costante statica taxPercent è 10. Il metodo di istanza total() restituisce il subtotale più l'imposta (arrotondato per difetto), mentre il metodo statico summary(of:) riceve un array di ordini e restituisce 3 orders, 660 total.
Il codice fornito legge un subtotale per riga, crea un ordine per ciascuno, stampa #1: 110 per ogni ordine e infine stampa il riepilogo.
Il tuo codice va in Order.swift. main.swift contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
// Codice di input/output fornito: lascialo così com'è
var input: [String] = []
while let line = readLine() { input.append(line) }
var orders: [Order] = []
for line in input {
let order = Order(subtotal: Int(line)!)
orders.append(order)
print("#\(order.id): \(order.total())")
}
print(Order.summary(of: orders))
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