swift

Le properties associano un particolare valore a classi, strutture ed enumerazioni. Le properties possono essere di due tipi:

  • stored properties
  • computed properties

Le prime sono costanti o variabili definite tramite le parole chiave let e var e possono far parte di classi e strutture. Le seconde sono proprietà ottenute da un calcolo e possono far parte di classi, strutture ed enumerazioni.

Le proprietà, sia stored che computed, possono essere di tipo statico in questo caso prendono il nome di type properties (le vediamo nella seconda parte).

Definiamo una struttura con due stored properties, una variabile e l'altra costante:

struct IntervalloLunghezzaFissa {

    var valoreIniziale: Int

    let intervallo: Int

}

var intervalloTre = IntervalloLunghezzaFissa(valoreIniziale: 0, intervallo: 3)

intervalloTre.valoreIniziale = 6

Quando viene creata l'istanza della struttura IntervalloLunghezzaFissa vengono associati due valori alle proprietà. Solo uno di questi due valori è successivamente modificabile in quanto variabile, il valore definito con let è costante e una volta inizializzato non è più modificabile. 

E' necessario fare una precisazione in merito alle variabili e alle costanti. Se la struttura IntervalloLunghezzaFissa viene associata ad una costante la variabile internamente definita diventa anch'essa costante. Questo avviene perché la struttura è un tipo valore (value type). La stessa cosa non sarebbe valida per una classe in quanto la classe è un tipo riferimento (reference type).

Oltre alle proprietà memorizzate (stored properties) dove una volta creata l'istanza i valori vengono memorizzati e associati a proprietà siano esse variabili o costanti, ci sono le proprietà calcolate (computed properties) dove i valori non vengono memorizzati ma ottenuti attraverso un calcolo. Queste proprietà utilizzano la parola chiave get e set.

Con get leggo il valore della computed propety ovvero un valore ottenuto dal calcolo effettuato su altre proprietà.

Con set scrivo il valore nella computed property che equivale a scrivere indirettamente il valore delle stored properties attraverso il calcolo effettuato.

Nell'esempio che segue imposto due punti sul piano, tramite computed properties restituisco la distanza e la velocità di spostamento dal punto A al punto B.

// Coordinate x e y nel piano al tempo t (metri e secondi)

struct PuntoNelPiano {

    var x = 0, y = 0

    var t = 0

}

struct Percorso {

    var partenza = PuntoNelPiano()

    var arrivo = PuntoNelPiano()

  

    var tempoPercorrenza: Int {

        

        get {

            return arrivo.t - partenza.t

        }

        

        set(newT) {

            partenza.t = 0

            arrivo.t = newT

        }

    }

    

    var distanza: Double {

        

        get {

            let deltaX = arrivo.x - partenza.x

            let deltaY = arrivo.y - partenza.y

            let temp = sqrt(pow(Double(deltaX), 2) + pow(Double(deltaY), 2))

            return temp

        }

    }

    

    var velocità: Double {

        

        get {

            return distanza/Double(tempoPercorrenza)

        }

    }

}

let puntoA = PuntoNelPiano(x: 0, y: 0, t: 0)    //Imposto il punto di partenza

let puntoB = PuntoNelPiano(x: 10, y: 10, t: 10//Imposto il punto di arrivo

var percorsoAB = Percorso(partenza: puntoA, arrivo: puntoB)

percorsoAB.tempoPercorrenza = //Cambio il tempo di percorrenza

let distanza = percorsoAB.distanza //Leggo la proprietà calcolata = 14,14 m

let velocità = percorsoAB.velocità //Lego la proprietà calcolata = 1,76 m/sec

Nella struttura Percorso creo due stored properties creando le variabili partenza e arrivo che sono due istanze della struttura PuntoNelPiano. Successivamente creo la variabile (computed property) tempoPercorrenza. Questa variabile, quando la vado a leggere, calcola la differenza dei due tempi impostati nelle proprietà partenza e arrivo e restituisce un valore intero. Questo avviene grazie alla parola chiave get. Tramite set posso impostare un nuovo tempo di percorrenza andando a impostare il valore t delle variabili partenza e arrivo. Vengono create altre due proprietà calcolate: distanza e velocità; il metodo è lo stesso, tramite un calcolo e la parola chiave get la variabile assume un preciso valore quando interrogata.

Da notare che la parola chiave set è seguita dal nome di una variabile (newT) che viene utilizzata per veicolare il nuovo valore nel calcolo; si può evitare di specificarla e Swift assegna "d'ufficio" il nome "newValue" che può essere utilizzato al posto di newT.

Sempre nell'ottica della semplificazione le due proprietà distanza e velocità sono in sola lettura, cioè sprovviste del "setter"; è possibile di conseguenza evitare di scrivere get e rendere il codice più semplice da leggere.

var velocità: Double {

  return distanza/Double(tempoPercorrenza)

}