Menu
Coddy logo textTech

Wertsemantik

Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 8 von 57.

Structs sind Werttypen: Wenn du eine Struct einer anderen Variable zuweist, wird sie kopiert. Änderungen an der Kopie lassen das Original unverändert, anders als bei einer Klasse:

struct Point {
    var x: Int
}

var a = Point(x: 1)
var b = a
b.x = 99
print(a.x)
print(b.x)

Ausgabe:

1
99

Der gleiche Vergleich mit einer Klasse zeigt den Unterschied: Beide Variablen verweisen auf dasselbe Objekt.

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)

Ausgabe:

99

Das Übergeben einer Struktur an eine Funktion übergibt ebenfalls eine Kopie. Der Parameter ist eine Konstante. Um eine geänderte Version zurückzugeben, erstellt die Funktion eine lokale Kopie und gibt sie zurück:

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)

Ausgabe:

1
5

Arrays aus Strukturen enthalten unabhängige Werte. Das Ändern eines Elements über seinen Index ändert nur dieses Element, und beim Kopieren des Arrays wird jeder Wert kopiert:

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)

Ausgabe:

1
50
challenge icon

Aufgabe

Einfach

Vervollständige tryDiscount(_:percent:). Die Funktion erhält eine Price-Struktur und gibt eine rabattierte Kopie zurück: Die Anzahl der Cents wird um den Prozentsatz verringert und abgerundet. Der bereitgestellte Code gibt den ursprünglichen und den rabattierten Preis aus, daher muss das Original unverändert bleiben.

Der bereitgestellte Code liest einen Preis in Cents und pro Zeile einen Prozentsatz ein und gibt für jeden Eintrag was 1000, now 900 aus.

Dein Code gehört in Price.swift und Functions.swift. main.swift enthält den bereitgestellten Eingabe-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

// Bereitgestellter Ein-/Ausgabecode: belasse ihn wie er ist
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Swift-Playground