Menu
Coddy logo textTech

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
99

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

99

Passare 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
5

Gli 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
50
challenge icon

Sfida

Facile

Completa 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)")
}
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