Szukaj…


Podstawy konstrukcji

struct Repository {
    let identifier: Int
    let name: String
    var description: String?
}

Definiuje to strukturę Repository z trzema przechowywanymi właściwościami, identifier liczby całkowitej, name ciągu i opcjonalnym description ciągu. identifier i name są stałymi, ponieważ zostały zadeklarowane przy użyciu słowa kluczowego let . Po ustawieniu podczas inicjalizacji nie można ich modyfikować. Opis jest zmienną. Modyfikacja powoduje aktualizację wartości struktury.

Typy struktur automatycznie otrzymują inicjalizator członkowski, jeśli nie zdefiniują żadnych własnych niestandardowych inicjatorów. Struktura otrzymuje inicjalizator członkowski, nawet jeśli ma zapisane właściwości, które nie mają wartości domyślnych.

Repository zawiera trzy przechowywane właściwości, z których tylko description ma wartość domyślną ( nil ). Ponadto nie definiuje żadnych własnych inicjatorów, więc otrzymuje inicjalizator członkowski za darmo:

let newRepository = Repository(identifier: 0, name: "New Repository", description: "Brand New Repository")

Struktury są typami wartości

W przeciwieństwie do klas, które są przekazywane przez odwołanie, struktury są przekazywane przez kopiowanie:

first = "Hello"
second = first
first += " World!"
// first == "Hello World!"
// second == "Hello"

Łańcuch jest strukturą, dlatego jest kopiowany przy przypisaniu.

Struktur również nie można porównywać za pomocą operatora tożsamości:

window0 === window1 // works because a window is a class instance
"hello" === "hello" // error: binary operator '===' cannot be applied to two 'String' operands

Każde dwa wystąpienia struktury są uważane za identyczne, jeśli porównują się równe.

Te cechy, które odróżniają struktury od klas, są tym, co sprawia, że struktury są wartościami.

Mutowanie konstrukcji

Metoda struktury, która zmienia wartość samej struktury, musi być poprzedzona słowem kluczowym mutating

struct Counter {
    private var value = 0
    
    mutating func next() {
        value += 1
    }
}

Kiedy możesz zastosować metody mutacji

Metody mutating są dostępne tylko dla wartości struktur wewnątrz zmiennych.

var counter = Counter()
counter.next()

Kiedy NIE możesz użyć metod mutowania

Z drugiej strony metody mutating NIE są dostępne dla wartości struktur wewnątrz stałych

let counter = Counter()
counter.next()
//  error: cannot use mutating member on immutable value: 'counter' is a 'let' constant

Struktury nie mogą dziedziczyć

W przeciwieństwie do klas, struktury nie mogą dziedziczyć:

class MyView: NSView { }  // works

struct MyInt: Int { } // error: inheritance from non-protocol type 'Int'

Struktury mogą jednak przyjmować protokoły:

struct Vector: Hashable { ... }  // works

Dostęp do członków struct

W Swift struktury używają prostej „składni kropkowej”, aby uzyskać dostęp do swoich członków.

Na przykład:

struct DeliveryRange {
  var range: Double
  let center: Location
}
let storeLocation = Location(latitude: 44.9871,
                             longitude: -93.2758)
var pizzaRange = DeliveryRange(range: 200,
                               center: storeLocation)

Możesz uzyskać dostęp (wydrukować) taki zakres:

    print(pizzaRange.range) // 200

Możesz nawet uzyskać dostęp do członków członków za pomocą składni kropkowej:

 print(pizzaRange.center.latitude) // 44.9871

Podobnie do sposobu odczytywania wartości za pomocą składni kropkowej, możesz także przypisać je.

pizzaRange.range = 250


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow