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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow