Semantica dei valori
Fa parte della sezione Programmazione orientata agli oggetti del percorso Swift di Coddy. Lezione 8 di 57.
Le struct sono tipi valore: assegnare una struct a un’altra variabile la copia. Modificare la copia lascia invariato l’originale, a differenza di una classe:
struct Point {
var x: Int
}
var a = Point(x: 1)
var b = a
b.x = 99
print(a.x)
print(b.x)Output:
1
99Lo stesso confronto con una classe mostra la differenza: entrambe le variabili fanno riferimento a un unico oggetto.
class PointRef {
var x: Int
init(x: Int) { self.x = x }
}
let a = PointRef(x: 1)
let b = a
b.x = 99
print(a.x)Output:
99Passare una struct a una funzione significa passarne anche una copia. Il parametro è una costante, quindi, per restituire una versione modificata, la funzione crea una copia locale e la restituisce:
struct Point {
var x: Int
}
func shifted(_ p: Point, by dx: Int) -> Point {
var copy = p
copy.x += dx
return copy
}
let start = Point(x: 1)
let moved = shifted(start, by: 4)
print(start.x)
print(moved.x)Output:
1
5Gli array di struct contengono valori indipendenti. Modificare un elemento tramite il suo indice modifica solo quell'elemento, e copiare l'array copia ogni valore:
struct Score {
var points: Int
}
var round1 = [Score(points: 1), Score(points: 2)]
var round2 = round1
round2[0].points = 50
print(round1[0].points)
print(round2[0].points)Output:
1
50Sfida
FacileCompleta tryDiscount(_:percent:). Riceve una struct Price e restituisce una copia scontata: i centesimi ridotti della percentuale, arrotondati per difetto. Il codice fornito stampa il prezzo originale e quello scontato, quindi l'originale deve rimanere invariato.
Il codice fornito legge un prezzo in centesimi e una percentuale per riga, e stampa was 1000, now 900 per ciascuna.
Il tuo codice va in Price.swift e Functions.swift. main.swift contiene il codice fornito per l'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 original = Price(cents: Int(input[0])!)
for line in input.dropFirst() {
let cheaper = tryDiscount(original, percent: Int(line)!)
print("was \(original.cents), now \(cheaper.cents)")
}
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