Swift Language
Structs
Ricerca…
Nozioni di base di strutture
struct Repository {
let identifier: Int
let name: String
var description: String?
}
Definisce una struttura di Repository
con tre proprietà memorizzate, un identifier
numero intero, un name
stringa e una description
stringa facoltativa. L' identifier
e il name
sono costanti, in quanto sono stati dichiarati usando let
-keyword. Una volta impostati durante l'inizializzazione, non possono essere modificati. La descrizione è una variabile. La modifica aggiorna il valore della struttura.
I tipi di struttura ricevono automaticamente un inizializzatore membro se non definiscono alcuno dei propri inizializzatori personalizzati. La struttura riceve un inizializzatore membro, anche se ha memorizzato le proprietà che non hanno valori predefiniti.
Repository
contiene tre proprietà memorizzate di cui solo la description
ha un valore predefinito ( nil
). Inoltre non definisce alcun inizializzatore, quindi riceve gratuitamente un inizializzatore membro:
let newRepository = Repository(identifier: 0, name: "New Repository", description: "Brand New Repository")
Le strutture sono tipi di valore
A differenza delle classi, che vengono passate per riferimento, le strutture passano attraverso la copia:
first = "Hello"
second = first
first += " World!"
// first == "Hello World!"
// second == "Hello"
String è una struttura, quindi è copiata sul compito.
Anche le strutture non possono essere confrontate con l'operatore di identità:
window0 === window1 // works because a window is a class instance
"hello" === "hello" // error: binary operator '===' cannot be applied to two 'String' operands
Ogni istanza di due strutture è considerata identica se si confronta uguale.
Collettivamente, questi tratti che differenziano le strutture dalle classi sono ciò che rende i tipi di valore delle strutture.
Mutare una Struct
Un metodo di una struttura che modifica il valore della struttura stessa deve essere preceduto dalla parola chiave mutating
struct Counter {
private var value = 0
mutating func next() {
value += 1
}
}
Quando puoi usare i metodi di muting
I metodi mutating
sono disponibili solo sui valori della struttura all'interno delle variabili.
var counter = Counter()
counter.next()
Quando NON puoi usare metodi di muting
D'altra parte, i metodi di mutating
NON sono disponibili sui valori di struct all'interno di costanti
let counter = Counter()
counter.next()
// error: cannot use mutating member on immutable value: 'counter' is a 'let' constant
Le strutture non possono ereditare
A differenza delle classi, le strutture non possono ereditare:
class MyView: NSView { } // works
struct MyInt: Int { } // error: inheritance from non-protocol type 'Int'
Le strutture, tuttavia, possono adottare protocolli:
struct Vector: Hashable { ... } // works
Accesso ai membri di struct
In Swift, le strutture usano una semplice "sintassi del punto" per accedere ai loro membri.
Per esempio:
struct DeliveryRange {
var range: Double
let center: Location
}
let storeLocation = Location(latitude: 44.9871,
longitude: -93.2758)
var pizzaRange = DeliveryRange(range: 200,
center: storeLocation)
Puoi accedere (stampare) la gamma in questo modo:
print(pizzaRange.range) // 200
Puoi anche accedere ai membri dei membri usando la sintassi del punto:
print(pizzaRange.center.latitude) // 44.9871
Simile a come puoi leggere i valori con la sintassi del punto, puoi anche assegnarli.
pizzaRange.range = 250