Swift Language
Structs
Suche…
Grundlagen der Strukturen
struct Repository {
let identifier: Int
let name: String
var description: String?
}
Dies definiert eine Repository
Struktur mit drei gespeicherten Eigenschaften, einem Integer- identifier
, einem String- name
und einer optionalen String- description
. Der identifier
und der name
sind Konstanten, da sie mit dem let
-keyword deklariert wurden. Einmal während der Initialisierung festgelegt, können sie nicht mehr geändert werden. Die Beschreibung ist eine Variable. Durch das Ändern wird der Wert der Struktur aktualisiert.
Strukturtypen erhalten automatisch einen Memberwise-Initialisierer, wenn sie keine eigenen benutzerdefinierten Initialisierer definieren. Die Struktur erhält einen Memberwise-Initialisierer, auch wenn Eigenschaften gespeichert sind, die keine Standardwerte haben.
Repository
enthält drei gespeicherte Eigenschaften, von denen nur description
einen Standardwert ( nil
) hat. Außerdem definiert es keine eigenen Initialisierer, so dass es kostenlos einen Memberwise-Initialisierer erhält:
let newRepository = Repository(identifier: 0, name: "New Repository", description: "Brand New Repository")
Strukturen sind Werttypen
Im Gegensatz zu Klassen, die als Referenz übergeben werden, werden Strukturen durch Kopieren übergeben:
first = "Hello"
second = first
first += " World!"
// first == "Hello World!"
// second == "Hello"
String ist eine Struktur, daher bei der Zuweisung kopiert.
Strukturen können auch nicht mit dem Identitätsoperator verglichen werden:
window0 === window1 // works because a window is a class instance
"hello" === "hello" // error: binary operator '===' cannot be applied to two 'String' operands
Alle zwei Strukturinstanzen gelten als identisch, wenn sie gleich sind.
Zusammengenommen machen diese Merkmale, die Strukturen von Klassen unterscheiden, den Werttyp von Strukturen.
Eine Struktur mutieren
Einer Methode einer Struktur, die den Wert der Struktur selbst ändert, muss das mutating
Schlüsselwort vorangestellt werden
struct Counter {
private var value = 0
mutating func next() {
value += 1
}
}
Wann können Sie Mutationsmethoden verwenden
Die mutating
sind nur für Strukturwerte in Variablen verfügbar.
var counter = Counter()
counter.next()
Wenn Sie KEINE Mutationsmethoden verwenden können
Andererseits sind mutating
für Strukturwerte innerhalb von Konstanten NICHT verfügbar
let counter = Counter()
counter.next()
// error: cannot use mutating member on immutable value: 'counter' is a 'let' constant
Strukturen können nicht erben
Im Gegensatz zu Klassen können Strukturen nicht erben:
class MyView: NSView { } // works
struct MyInt: Int { } // error: inheritance from non-protocol type 'Int'
Strukturen können jedoch Protokolle übernehmen:
struct Vector: Hashable { ... } // works
Zugriff auf Mitglieder von struct
In Swift verwenden Strukturen eine einfache "Punktsyntax", um auf ihre Mitglieder zuzugreifen.
Zum Beispiel:
struct DeliveryRange {
var range: Double
let center: Location
}
let storeLocation = Location(latitude: 44.9871,
longitude: -93.2758)
var pizzaRange = DeliveryRange(range: 200,
center: storeLocation)
Sie können auf den Bereich wie folgt zugreifen (drucken):
print(pizzaRange.range) // 200
Sie können sogar mit der Punktsyntax auf Mitglieder zugreifen:
print(pizzaRange.center.latitude) // 44.9871
Ähnlich wie Sie Werte mit Punktsyntax lesen können, können Sie sie auch zuweisen.
pizzaRange.range = 250