Berechnete Eigenschaften
Teil des Abschnitts Objektorientierte Programmierung der Swift-Journey von Coddy. Lektion 12 von 57.
Eine gespeicherte Eigenschaft enthält einen Wert. Eine berechnete Eigenschaft verfügt über keinen Speicherplatz: Bei jedem Lesen führt sie Code aus und gibt einen aus anderen Eigenschaften berechneten Wert zurück:
struct Rectangle {
var width: Double
var height: Double
var area: Double {
width * height
}
}
var r = Rectangle(width: 3, height: 4)
print(r.area)
r.width = 10
print(r.area)Ausgabe:
12.0
40.0Da der Wert bei jedem Lesen neu berechnet wird, kann eine berechnete Eigenschaft niemals veraltet sein. Sie wird wie eine gespeicherte Eigenschaft gelesen, ohne Klammern:
struct Person {
var first: String
var last: String
var fullName: String {
"\(first) \(last)"
}
}
var p = Person(first: "Ada", last: "Byron")
p.last = "Lovelace"
print(p.fullName)Ausgabe:
Ada LovelaceEine berechnete Eigenschaft kann auch einen Setter haben. set empfängt den neuen Wert als newValue und aktualisiert die gespeicherten Eigenschaften, auf denen sie basiert:
struct Temperature {
var celsius: Double
var fahrenheit: Double {
get { celsius * 9 / 5 + 32 }
set { celsius = (newValue - 32) * 5 / 9 }
}
}
var t = Temperature(celsius: 100)
print(t.fahrenheit)
t.fahrenheit = 32
print(t.celsius)Ausgabe:
212.0
0.0Verwende eine berechnete Eigenschaft für einen Wert, der sich aus anderen Werten ergibt und kostengünstig zu berechnen ist. Verwende eine Methode, wenn die Arbeit Argumente entgegennimmt oder aufwendig ist:
struct Order {
var items: [Int]
var total: Int { items.reduce(0, +) } // Eigenschaft: keine Argumente
func total(withTax rate: Int) -> Int { // Methode: nimmt ein Argument
total + total * rate / 100
}
}Aufgabe
EinfachVervollständige die Struktur Circle mit einer gespeicherten Eigenschaft radius und drei schreibgeschützten berechneten Eigenschaften: diameter (das Doppelte des Radius), area (π r² unter Verwendung von Double.pi) und label, die r=2.0 d=4.0 a=12.57 zurückgibt, wobei die Fläche mithilfe von String(format: "%.2f", area) auf zwei Dezimalstellen gerundet wird.
Der bereitgestellte Code liest pro Zeile einen Radius ein, erstellt einen Circle und gibt label aus. Anschließend verdoppelt er den Radius des letzten Kreises und gibt dessen label erneut aus, daher müssen die Werte dem Radius folgen.
Dein Code gehört in Circle.swift. main.swift enthält den bereitgestellten Ein-/Ausgabecode und darf nicht bearbeitet werden.
Probier es selbst
import Foundation
// Mitgelieferter Ein-/Ausgabecode: belasse ihn wie er ist
var input: [String] = []
while let line = readLine() { input.append(line) }
var last = Circle(radius: 0)
for line in input {
last = Circle(radius: Double(line)!)
print(last.label)
}
last.radius *= 2
print(last.label)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenMethoden und selfInitialisiererKlassen sind ReferenzenRückblick – Bibliotheksausweis4Kapselung
ZugriffskontrolleVon außen schreibgeschütztZustand schützenFehlschlagende InitialisiererRückblick – Bankkonto7Polymorphismus und Generika
PolymorphismusTypumwandlungGenerische FunktionenGenerische TypenZusammenfassung – Shape-Rechner2Strukturen und Werttypen
StrukturenWertsemantikVerändernde MethodenStruktur oder KlasseZusammenfassung – Inventarelement5Vererbung
UnterklassenMethoden überschreibenInitialisierer und superfinal und HierarchienRückblick – Mitarbeiterhierarchie8Standardprotokolle
CustomStringConvertibleEquatableComparableHashableRückblick – Benutzerdefiniertes Sortieren11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihen3Eigenschaften im Detail
Berechnete EigenschaftenEigenschaftsbeobachterStatische MemberEnums mit MethodenRückblick – TemperaturprotokollÜbe selbstständig: Swift-Playground