Swift Language
Struktury
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