Menu
Coddy logo textTech

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

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

2

Le 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
false

Un 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 }
}
challenge icon

Sfida

Facile

Point è 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))")
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