Menu
CoddyTech

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.0

Una 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
2

Una 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:

384

All'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
}
challenge icon

Sfida

Facile

Completa 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))
quiz iconMettiti alla prova

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

Esercitati da solo: Playground Swift