Swift Language
structs
Zoeken…
Basisprincipes van structuren
struct Repository {
let identifier: Int
let name: String
var description: String?
}
Dit definieert een Repository
structuur met drie opgeslagen eigenschappen, een integer identifier
, een string name
en een optionele tekenreeks description
. De identifier
en name
zijn constanten, zoals ze zijn gedeclareerd met behulp van het let
-keyword. Eenmaal ingesteld tijdens de initialisatie, kunnen ze niet worden gewijzigd. De beschrijving is een variabele. Door het te wijzigen, wordt de waarde van de structuur bijgewerkt.
Structuurtypen ontvangen automatisch een lidsgewijze initialisatie als ze geen eigen aangepaste initialisatie definiëren. De structuur ontvangt een initialisatie voor leden, zelfs als deze eigenschappen heeft die geen standaardwaarden hebben.
Repository
bevat drie opgeslagen eigenschappen waarvan alleen de description
een standaardwaarde ( nil
) heeft. Verder definieert het geen eigen initializers, dus ontvangt het gratis een memberwise initializer:
let newRepository = Repository(identifier: 0, name: "New Repository", description: "Brand New Repository")
Structs zijn waardetypes
In tegenstelling tot klassen, die worden doorgegeven door middel van verwijzing, worden structuren doorgegeven door te kopiëren:
first = "Hello"
second = first
first += " World!"
// first == "Hello World!"
// second == "Hello"
String is een structuur en wordt daarom op opdracht gekopieerd.
Structuren kunnen ook niet worden vergeleken met de operator identiteit:
window0 === window1 // works because a window is a class instance
"hello" === "hello" // error: binary operator '===' cannot be applied to two 'String' operands
Elke twee structuurinstanties worden als identiek beschouwd als ze gelijk zijn.
Gezamenlijk maken deze eigenschappen die structuren onderscheiden van klassen, structuren waardetypes.
Een structuur muteren
Een methode van een struct die de waarde van de struct zelf verandert, moet worden voorafgegaan door het mutating
trefwoord
struct Counter {
private var value = 0
mutating func next() {
value += 1
}
}
Wanneer u mutatiemethoden kunt gebruiken
De mutating
zijn alleen beschikbaar voor struct-waarden binnen variabelen.
var counter = Counter()
counter.next()
Wanneer u GEEN mutatiemethoden kunt gebruiken
Aan de andere kant zijn mutating
NIET beschikbaar voor structwaarden in constanten
let counter = Counter()
counter.next()
// error: cannot use mutating member on immutable value: 'counter' is a 'let' constant
Structs kunnen niet erven
In tegenstelling tot klassen kunnen structuren niet erven:
class MyView: NSView { } // works
struct MyInt: Int { } // error: inheritance from non-protocol type 'Int'
Structuren kunnen echter protocollen aannemen:
struct Vector: Hashable { ... } // works
Toegang krijgen tot leden van struct
In Swift gebruiken structuren een eenvoudige "puntsyntaxis" om toegang te krijgen tot hun leden.
Bijvoorbeeld:
struct DeliveryRange {
var range: Double
let center: Location
}
let storeLocation = Location(latitude: 44.9871,
longitude: -93.2758)
var pizzaRange = DeliveryRange(range: 200,
center: storeLocation)
U kunt het bereik als volgt openen (afdrukken):
print(pizzaRange.range) // 200
U hebt zelfs toegang tot leden van leden met behulp van puntsyntaxis:
print(pizzaRange.center.latitude) // 44.9871
Vergelijkbaar met hoe u waarden kunt lezen met puntsyntaxis, kunt u ze ook toewijzen.
pizzaRange.range = 250