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