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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow