Struct o classe
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 10 di 57.
La linea guida di Swift è iniziare con una struct e scegliere una class solo quando ti serve ciò che solo le class possono offrire. Le struct sono più semplici: ogni variabile possiede il proprio valore, quindi una modifica in un punto non sorprende mai il codice in un altro punto.
struct Temperature {
var celsius: Double
}
var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)Output:
21.0Scegli una classe quando un oggetto deve essere condiviso: diverse parti del programma devono poter vedere lo stesso stato mutevole, come nel caso di un conto bancario usato da molte schermate. Le classi supportano anche l’ereditarietà, cosa che le struct non fanno.
class SharedLog {
var lines: [String] = []
}
let log = SharedLog()
let moduleA = log
let moduleB = log
moduleA.lines.append("A started")
moduleB.lines.append("B started")
print(log.lines.count)Output:
2Le struct possono ottenere == gratuitamente. Aggiungi Equatable alla dichiarazione e Swift confronta ogni proprietà; le classi confrontano invece l'identità con ===:
struct Point: Equatable {
var x: Int
var y: Int
}
print(Point(x: 1, y: 2) == Point(x: 1, y: 2))
print(Point(x: 1, y: 2) == Point(x: 2, y: 1))Output:
true
falseUn rapido controllo: se due elementi con gli stessi dati devono essere considerati la stessa cosa, usa una struct (un punto, un prezzo, una data). Se un elemento ha un’identità che conta anche quando i suoi dati corrispondono a quelli di un altro elemento (un account utente, un file aperto), usa una class.
struct Money { var cents: Int } // 500 centesimi sono 500 centesimi
class UserAccount { // due account possono avere lo stesso nome
let id: Int
var name: String
init(id: Int, name: String) { self.id = id; self.name = name }
}Sfida
FacilePoint è una struct che dovrebbe poter essere confrontata con ==. Aggiungi la conformità e completa countDistinct(_:), che restituisce quanti punti diversi ci sono nell'elenco (due punti sono uguali quando entrambe le coordinate coincidono).
Il codice fornito legge un punto per riga nel formato x,y e stampa distinct: seguito dal conteggio.
Il tuo codice va inserito in Point.swift e Functions.swift. main.swift contiene il codice fornito per input/output 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) }
let points = input.map { line -> Point in
let p = line.split(separator: ",").map { Int($0)! }
return Point(x: p[0], y: p[1])
}
print("distinct: \(countDistinct(points))")
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