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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow