NUMERI
Gli integers possono essere scritti come:

  1. Un numero decimale, senza il prefisso
  2. Un numero binario, con un prefisso 0b 
  3. Un numero ottale, con un prefisso 0o
  4. Un numero esadecimale, con un prefisso 0x

Tutti questi letterali interi hanno un valore decimale di 17:

let decimalInteger = 17
let binaryInteger = 0b10001 // 17 in binary notation
let octalInteger = 0o21 // 17 in octal notation
let hexadecimalInteger = 0x11 // 17 in hexadecimal notation

I numeri in virgola mobile possono essere decimale (senza prefisso), o esadecimale (con un prefisso 0x). Essi devono avere sempre un numero (o numero esadecimale) da entrambi le parti del punto di divisione decimale. Essi possono anche avere un esponente facoltativo, indicato da una e maiuscola o minuscola per i float decimali, o un p maiuscola o minuscola per i float esadecimali.

Per i numeri decimali con un esponente exp, il numero di base viene moltiplicato per 10exp:

1.25e2 rappresenta 1.25 × 102, or 125.0.
1.25e-2 rappresenta 1.25 × 10-2, or 0.0125.

Per i numeri esadecimali con esponente exp, la base viene moltiplicata per  2exp:

0xFp2 rappresenta 15 × 22, or 60.0.
0xFp-2 rappresenta 15 × 2-2, or 3.75.

I valori seguenti hanno un valore decimale di 12.1875:

let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0

Le costanti numeriche possono avere una formattazione extra per renderle più facili da leggere. Entrambi i numeri interi possono essere riempiti con zeri in più e possono contenere underscore per facilitarne la lettura. Nessun tipo di formattazione influisce sul valore reale:

let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1

CONVERSIONE DEI NUMERI

Utilizzare il tipo Int per tutte le costanti intere e variabili nel codice. Utilizzare il tipo integer per default in tutte le situazioni significa che le costanti e le variabili intere sono immediatamente utilizzabili all’interno del codice.

Utilizzare altri tipi interi solo quando strettamente necessario, in quanto influiscono sulle dimensioni dei dati trattati, sulle locazioni di memoria e questo richiede diverse ottimizzazioni.

Se vi accorgete che i valori sono ambigui e trarre in inganno il compilatore, specificate direttamente voi il tipo di dato così da evitare che il compilatore compia qualche errore.

 

CONVERSIONE DEI NUMERI INTERI

L’intervallo di numeri che possono essere memorizzati in una costante int o in una variabile è diversa per ogni tipo numerico. Una costante o una variabile int8 possono memorizzare numeri compresi tra -128 e 127, mentre una costante o una variabile Uint8 possono memorizzare numeri compresi tra 0 e 255. Se si inserisce un valore che non rientra nei due range sopra indicati verrà indicato come un errore dal compilatore:

let cannotBeNegative: UInt8 = -2
// UInt8 non può memorizzare numeri negativi, quindi restituirà un errore.
let tooBig: Int8 = Int8.max + 2
// Int8 non può memorizzare un numero più grande del suo valore massimo memorizzabile,
// e allo stesso modo restituirà un errore.

Poiché ogni tipo numerico può memorizzare una diversa gamma di valori, è necessario optare per una conversione numerica diversa ogni volta, secondo necessità. Questo approccio vi impedirà di compiere errori di conversione difficili da individuare e vi aiuterà a rendere le conversioni numeriche esplicite nel codice.

Per convertire un tipo di numero in un altro, inizializzate un nuovo numero del tipo desiderato con il valore esistente. Nell’esempio riportato di seguito, la Costante TwoThousand è di tipo UInt16, invece la costante uno è di tipo Uint8. Non possono essere sommati direttamente, perché non sono dello stesso tipo. Per ovviare a ciò, nell’esempio viene inizializzata UInt16 (uno) per creare un nuovo UInt16 con il valore di uno, utilizzando quindi questo nuovo valore per la somma con TwoThousand, che ora risulta dello stesso tipo:

let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)

Poiché entrambi i numeri ora sono di tipo UInt16, la somma è consentita. La costante di uscita (twoThousandAndOne) viene automaticamente riconosciuta di tipo UInt16, perché è la somma dei due valori UInt16.

SomeType (ofInitialValue) è il modo predefinito per chiamare l’inizializzatore di tipo Swift e passare un valore iniziale. “Dietro le quinte”, UInt16 ha un inizializzatore che accetta un valore Uint8, e quindi questo inizializzatore è usato per formare un nuovo UInt16 da un Uint8 esistente. Non è possibile passare dati di qualsiasi tipo ma solo tipi per il quale UInt16 può fornire un inizalizzazione. Vedremo più avanti come estendere il tipo di dati accettati.

Integer e Floating-Point
Le conversioni tra numeri interi e in virgola mobile devono essere specificate esplicitamente:

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to be of type Double

In questo esempio, il valore della costante tre viene utilizzato per creare un nuovo valore di tipo Double, in modo che entrambi i dati da sommare siano dello stesso tipo. Senza questa conversione, non sarebbe possibile mettere in atto la somma.

La stessa cosa vale per la conversione da numeri in virgola mobile a integer:

let integerPi = Int(pi)
// integerPi equals 3, and is inferred to be of type Int

I valori in virgola mobile vengono sempre approssimati quando viene utilizzato, per l’inizializzazione, un valore intero. Ciò significa che 4,75 diventa 4, e -3.9 diventa -3 “.

ALIAS
Gli alias definiscono un nome alternativo per un tipo già esistente, questi ultimi si definiscono con la parola chiave typealias.

Gli alias sono utili quando si vuole fare riferimento a un tipo esistente con un nome che è contestualmente più appropriato, ad esempio quando si lavora con i dati di un formato specifico da una sorgente esterna:

typealias AudioSample = UInt16

Una volta che si definisce un alias, si può utilizzare l’alias ovunque è possibile utilizzare il nome originale:

var maxAmplitudeFound = AudioSample.min
// maxAmplitudeFound is now 0

 

Qui, AudioSample è definito come un alias per UInt16. Essendo un alias, AudioSample.min chiama effettivamente UInt16.min, che fornisce un valore iniziale pari a 0 alla variabile maxAmplitudeFound.

VALORI BOOLEANI
Swift ha un tipo booleano di base, denominato Bool. I valori booleani sono indicati come logici, perché possono essere sempre e solo vero o falso. Swift ovviamente fornisce due valori costanti booleani, true e false:

let gliaranciSonoArancioni = true
let leRapeSonoDeliziose = false

gliaranciSonoArancioni” e “leRapeSonoDeliziose” sono state interpretati automaticamente come valori Booleani, essendo stati inizializzati con valori booleani. Come con Int e Double, non è necessario dichiarare costanti o variabili come Bool se li si imposta preventivamente su true o false in fase di creazione. Come abbiamo già visto, l’inferenza dei tipi contribuisce a rendere il codice Swift più conciso e leggibile quando si inizializza costanti o variabili con altri valori il cui tipo è già noto.

I valori booleani sono particolarmente utili quando si lavora con istruzioni condizionali, quali l’istruzione if:

if Lerapesonodelziose {
println(“Mmm, le rape sono squisite!”)
} else {
println(“Eww, le rape sono orribili.”)
}
// prints “Eww, le rape sono orribili.”

L’istruzione if verrà affrontata in modo approfondito nei capitoli successivi.

Swift impedisce che valori non booleani vengano sostituiti da valori Booleani. L’esempio seguente riporta un errore di compilazione:

let i = 1
if i {
// this example will not compile, and will report an error
}

Tuttavia, quest’altro esempio invece verrà accettato dal compilatore:

let i = 1
if i == 1 {
// this example will compile successfully
}

 

Siamo quasi alla fine di questo capitolo! Tra poco affronteremo, nella parte 3 di 3, le tuple e altri argomenti successivi.

 

VOLETE ESSERE AGGIORNATI TEMPESTIVAMENTE ALL’USCITA DI UN NUOVO CAPITOLO ? BASTA UN LIKE SULLA NOSTRA PAGINA FACEBOOK!