Sök…


Grunderna i strukturer

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

Detta definierar en Repository struct med tre lagrade egenskaper, ett heltal identifier , en sträng name , och en valfri sträng description . identifier och name är konstanter, eftersom de har deklarerats med let nyckelordet. När de har ställts in under initialiseringen kan de inte ändras. Beskrivningen är en variabel. Om du ändrar den uppdateras strukturen.

Strukturtyper får automatiskt en medlemsvis initierare om de inte definierar någon av sina egna anpassade initialiseringar. Strukturen får en initialiserad medelvisning även om den har lagrade egenskaper som inte har standardvärden.

Repository innehåller tre lagrade egenskaper, av vilka endast description har ett standardvärde ( nil ). Vidare definierar det inga egna initierare, så det får en medlemsvisande initialisator gratis:

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

Strukturer är värdetyper

Till skillnad från klasser, som ges genom referens, ges strukturer genom kopiering:

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

String är en struktur, därför kopieras den vid uppdrag.

Strukturer kan inte heller jämföras med identitetsoperatör:

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

Varje två strukturinstanser anses identiska om de jämför lika.

Sammantaget är dessa drag som skiljer strukturer från klasser det som gör strukturer till värdetyper.

Mutera en struktur

En metod för en struktur som ändrar värdet på strukturen själv måste förinställas med det mutating nyckelordet

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

När du kan använda mutationsmetoder

mutating är endast tillgängliga på strukturvärden inuti variabler.

var counter = Counter()
counter.next()

När du INTE kan använda mutationsmetoder

Å andra sidan är mutating INTE tillgängliga för strukturvärden inuti konstanter

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

Strukturer kan inte ärva

Till skillnad från klasser kan strukturer inte ärva:

class MyView: NSView { }  // works

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

Strukturer kan dock anta protokoll:

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

Få åtkomst till medlemmar i strukt

I Swift använder strukturer en enkel "dot-syntax" för att få åtkomst till sina medlemmar.

Till exempel:

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

Du kan komma åt (skriva ut) sortimentet så här:

    print(pizzaRange.range) // 200

Du kan till och med få åtkomst till medlemmar av medlemmar med hjälp av punktsyntax:

 print(pizzaRange.center.latitude) // 44.9871

På samma sätt som hur du kan läsa värden med punktsyntax, kan du också tilldela dem.

pizzaRange.range = 250


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow