Swift From Scratch collezioni e tuple

Nell'articolo precedente, hai imparato a conoscere variabili, costanti e alcuni tipi di dati comuni, come numeri interi, float e stringhe. In questo articolo, ingrandiamo le raccolte. La libreria standard di Swift definisce tre tipi di raccolta: insiemi, matrici e dizionari. Iniziamo con gli array.

1. Array

Se hai familiarità con Objective-C, JavaScript o PHP, non sarà difficile capire gli array. Una matrice è una raccolta di valori ordinati, indicizzati a zero. Ma ci sono alcune importanti differenze tra gli array per Swift e altri linguaggi di programmazione.

genere

La prima importante differenza rispetto agli array in Objective-C è che i valori memorizzati in un array sono sempre dello stesso tipo. All'inizio, questo può sembrare un limite significativo, ma in realtà non lo è. In realtà, questa limitazione ha un vantaggio importante. Sappiamo esattamente di che tipo torniamo quando chiediamo all'array uno dei suoi valori.

Un'altra differenza fondamentale è il tipo di valori che un array può memorizzare. In Objective-C, un array può solo memorizzare valori di un tipo di classe. Swift non ha questa limitazione. Un array in Swift può memorizzare stringhe, numeri interi, float e istanze di classe. Come funziona e perché questo sia possibile in Swift diventerà chiaro più avanti in questa serie quando tratteremo classi e strutture.

Dichiarazione

Mentre esistono diversi modi per creare un array, è necessario tenere presente che Swift deve sapere quale tipo di valori si prevede di memorizzare nell'array. Crea un nuovo parco giochi in Xcode, come abbiamo fatto nel precedente articolo, e aggiungi le seguenti linee al tuo parco giochi.

var array1: array var array2: [String] var array3 = ["Apple", "Pera", "Arancione"]

La prima e la seconda riga indicano la stessa cosa. La seconda riga è solo una scorciatoia. Le parentesi quadre che avvolgono il Stringa parola chiave tell Swift che stiamo dichiarando un array che può contenere solo Stringa oggetti.

È possibile leggere la prima riga di codice come: "Dichiariamo una variabile denominata array1 di tipo schieramento che può contenere solo Stringa oggetti. "Il colon significa di tipo.

La terza riga ci mostra come inizializzare un array usando un array letterale. I letterali di array sembrano molto simili ai letterali di array in Objective-C. La principale differenza è l'assenza del @ simbolo che precede le parentesi quadre e le stringhe letterali.

C'è anche un modo elegante per inizializzare un array con un numero predefinito di valori predefiniti. La sintassi può essere fonte di confusione all'inizio, ma prenditi un momento per lasciarlo affondare.

var a = [String] (ripetizione: "Test", conteggio: 5)

La matrice risultante contiene cinque stringhe, a parità di stringa "Test". Per comprendere meglio l'inizializzazione di cui sopra, dare un'occhiata alle seguenti due righe di codice in cui inizializziamo una matrice vuota di stringhe.

var b = matrice() var c = [String] ()

Non ti preoccupare se sei ancora confuso. Esploreremo la sintassi in modo più dettagliato una volta che avremo a che fare con classi e funzioni. In questo articolo, ci concentriamo solo sulle raccolte.

Mutabilità

Un aspetto di Swift che presto apprezzerai è come dichiarare le collezioni mutabili. Il frammento di codice sopra, ad esempio, dichiara tre matrici mutevoli. Un array mutabile è definito usando il var parola chiave. È così semplice.

Se non vuoi che un array sia mutabile, usa il permettere parola chiave. Swift mira ad essere intuitivo e facile da usare e la sua implementazione della mutabilità è un perfetto esempio di questo obiettivo.

Ottenere e impostare i valori

Per accedere ai valori memorizzati in una matrice, usiamo la stessa sintassi del pedice come in Objective-C. Nell'esempio seguente, chiediamo array3 per il suo secondo elemento, la stringa "Pera".

array3 [1]

Sostituzione del valore memorizzato all'indice 1 è semplice come assegnare un nuovo valore usando la stessa sintassi del pedice. Nel seguente esempio, sostituiamo "Pera" all'indice 1 con "Pesca".

array3 [1] = "Pesca"

Questo è possibile solo perché l'array è mutabile, cioè, abbiamo usato il var parola chiave per dichiarare la matrice. La mutazione di un array costante non è possibile. Esistono tecniche più avanzate per manipolare il contenuto di un array, ma il concetto sottostante è lo stesso.

L'unione di due array è semplice come aggiungerli. Nell'esempio seguente, dichiariamo e uniamo due array immutabili. Si noti che la matrice risultante, c, non ha bisogno di essere modificabile perché funzioni.

sia a = [1, 2, 3] sia b = [4, 5, 6] sia c = a + b

Tuttavia, è fondamentale che i valori memorizzati in un e B sono dello stesso tipo La ragione dovrebbe essere ovvia ora. Come ho detto prima, i valori memorizzati in un array devono essere dello stesso tipo. L'esempio seguente genera un errore.

sia a = [1, 2, 3] sia b = [1.5, 5.2, 6.3] sia c = a + b

Per aggiungere un array a un array mutabile, usiamo il += operatore. Si noti che l'operando sulla destra è una matrice. Questa operazione non funzionerebbe se rimuovessimo le parentesi quadre che circondano 4.

var a = [1, 2, 3] a + = [4]

operazioni

Le matrici sono oggetti su cui è possibile eseguire una vasta gamma di operazioni. Gli array espongono un numero di funzioni o metodi. Per richiamare un metodo su un oggetto, si usa la notazione a punti. Aggiungi la seguente linea al tuo parco giochi per aggiungere un oggetto a array3.

array3.append ( "Cherry")

Vediamo quanti oggetti array3 contiene controllandone il valore contare proprietà. Questo produce 4 nel riquadro dei risultati.

array3.count

È anche possibile inserire un elemento in un indice specifico richiamando l'array inserire (_: a :) metodo come mostrato di seguito. Il inserire (_: a :) il metodo accetta più di un parametro e all'inizio la sintassi potrebbe sembrare un po 'strana.

array3.insert ("Prune", at: 2)

Come Objective-C, Swift supporta i parametri denominati per migliorare la leggibilità. Il risultato è che il codice è più facile da leggere e comprendere, e le funzioni o i metodi non hanno bisogno di molte spiegazioni in termini di ciò che fanno. È chiaro, ad esempio, che il inserire (_: a :) il metodo inserisce un elemento all'indice 2.

Mentre Swift è più conciso e meno prolisso di Objective-C, supporta i parametri denominati. Se provieni da PHP, Ruby o JavaScript, questo è sicuramente qualcosa a cui ci si deve abituare.

Metodi di convenienza

Quello che mi piace davvero di Swift sono le proprietà di convenienza e i metodi di Ruby della libreria standard di Swift. Un array, per esempio, ha un è vuoto proprietà che ti dice se l'array contiene elementi. Questa non è altro che una scorciatoia per controllare gli array contare proprietà. Il risultato, tuttavia, è un codice più conciso e più facile da leggere.

array3.isEmpty

2. Dizionari

I dizionari si comportano in modo molto simile ai dizionari in Objective-C. Un dizionario memorizza una collezione di valori non ordinata. Ogni valore nel dizionario è associato a una chiave. In altre parole, un dizionario memorizza un numero di coppie chiave / valore.

genere

Come con gli array, le chiavi e i valori memorizzati in un dizionario devono essere dello stesso tipo. Ciò significa che se chiedi a un dizionario il valore di una determinata chiave, sai che tipo restituirà il dizionario.

Dichiarazione

Dichiarare un dizionario è simile alla dichiarazione di un array. La differenza è che è necessario specificare il tipo per entrambe le chiavi e i valori. L'esempio seguente mostra tre modi per dichiarare un dizionario.

var dictionary1: Dictionary var dictionary2: [String: Int] var dictionary3 = ["Apple": 3, "Pera": 8, "Arancione": 11]

La seconda riga è una scorciatoia per la prima riga. Le chiavi di questi dizionari devono essere di tipo Stringa mentre i valori dovrebbero essere di tipo Int. Il var parola chiave indica che i dizionari sono modificabili.

È possibile leggere la prima riga di codice come: "Dichiariamo una variabile denominata dictionary1 di tipo Dizionario che può contenere solo chiavi di tipo Stringa e valori di tipo Int."

La terza riga illustra come possiamo inizializzare un dizionario usando un dizionario letterale. Questo è simile alla sintassi che usiamo in Objective-C, ma si noti che le parentesi graffe sono sostituite da parentesi quadre e il letterale non è prefissato con un @ simbolo.

Ottenere e impostare i valori

L'accesso ai valori è simile all'accesso ai valori di un array. L'unica differenza è che si utilizza la chiave anziché l'indice del valore a cui è necessario accedere. Il seguente esempio illustra questo.

let value = dictionary3 ["Apple"] print (valore)

Noterai che Xcode ci dice che il valore di valore non è 3, ma Opzionale (3). Cosa significa questo? Swift usa le opzioni per racchiudere valori che possono essere una delle due cose, un valore o zero. Non preoccuparti degli optionals a questo punto. Ci concentreremo sugli optionals nel prossimo articolo di questa serie. Lasciatemi dire che gli optionals sono un altro concetto chiave del linguaggio di programmazione Swift.

È interessante sottolineare che la sintassi per accedere a un valore di un dizionario è identica a quella degli array se le chiavi del dizionario sono di tipo Int. Dai un'occhiata al seguente esempio per vedere cosa intendo.

var dictionary4 = [0: "Apple", 1: "Pera", 2: "Arancione"] let fruit = dictionary4 [0]

operazioni

Come per gli array, la libreria standard Swift definisce un'ampia gamma di operazioni che è possibile eseguire sui dizionari. Puoi chiedere a un dizionario il suo numero di coppie chiave / valore attraverso il suo contare proprietà. La rimozione di una coppia chiave / valore è facile e intuitiva, come illustra il prossimo esempio. Naturalmente, questo è possibile solo se il dizionario è modificabile.

dictionary4.removeValue (forKey: 0)

Quando inizi a imparare Swift, potresti imbatterti in snippet di codice che sembrano strani o confusi. Dai un'occhiata alla seguente riga, in cui per prima cosa dichiariamo un dizionario e quindi rimuoviamo le sue coppie chiave / valore.

var dictionary = [String: Int] () dizionario ["Oranges"] = 2 dizionario ["Apples"] = 10 dizionario ["Pears"] = 5 dictionary = [:]

Devi ammettere che l'ultima riga sembra un po 'strana. Perché Swift conosce i tipi di chiavi e valori che possono essere memorizzati dizionario, svuotare il dizionario è semplice come assegnargli un dizionario vuoto.

Non è necessario specificare i tipi per le chiavi e i valori in questo caso, perché lo abbiamo già fatto quando abbiamo dichiarato il dizionario nella prima riga. Questo indica un altro dettaglio importante, ovvero il tipo di valori che è possibile memorizzare negli array e i dizionari non possono essere modificati una volta che la raccolta è stata dichiarata.

3. Imposta

Gli insiemi sono molto simili agli array in quanto memorizzano una raccolta di valori dello stesso tipo. Ma ci sono molte differenze importanti. Gli elementi memorizzati in un set non sono ordinati e ogni elemento può apparire solo una volta in un set.

Dichiarazione

Lavorare con i set è un po 'diverso dal lavorare con gli array. Dai un'occhiata ai prossimi esempi in cui dichiariamo tre serie. Il set1 la variabile è di tipo Impostato, un set che può contenere solo valori di tipo Stringa.

var set1: set var set2 = Set() var set3: impostato = ["Apple", "Pera", "Arancione"]

Il set2 variable è un set vuoto e nel terzo esempio usiamo un array letterale per creare e popolare un set mutabile che contiene tre valori. Grazie all'inferenza di tipo di Swift, possiamo omettere il tipo di set.

var set3: Set = ["Apple", "Pera", "Arancione"]

Manipolazione degli insiemi

Lavorare con gli insiemi è simile a lavorare con gli array. Possiamo chiedere il numero di elementi memorizzati in un set controllando il set contare proprietà.

set3.count

Inserire un elemento è facile. Poiché gli elementi di un insieme non sono ordinati, non è necessario specificare la posizione del nuovo elemento.

set3.insert ( "Prune")

E lo stesso vale per la rimozione di un elemento da un set.

set3.remove ( "Orange")

Puoi anche chiedere un set se contiene un elemento particolare.

set3.contains ( "Apple")

Array o set

Mi riferisco spesso agli insiemi come versioni leggere degli array. Se l'ordine degli elementi non è importante o vuoi assicurarti che ogni elemento possa apparire solo una volta in una collezione, allora i set sono la strada da percorrere.

4. Tuple

Amerai le tuple. Le tuple non sono raccolte, ma come collezioni, raggruppano anche più valori. Simile a matrici e dizionari, le tuple possono contenere valori di qualsiasi tipo. La differenza chiave, tuttavia, è che i valori memorizzati in una tupla non devono necessariamente essere dello stesso tipo. Diamo un'occhiata a un esempio per spiegarlo in modo più dettagliato.

import Foundation var currency = ("EUR", 0.81) var time = (Date (), "Questo è il mio messaggio.") var email = ("Bart Jacobs", "[email protected]")

Il primo esempio dichiara una tupla chiamata moneta questo è di tipo (String, Int). La seconda tupla, tempo, contiene a Data istanza e una stringa letterale. I valori memorizzati in e-mail sono entrambi di tipo Stringa, che significa e-mail è di tipo (String, String).

Accesso ai valori

indici

Per accedere a un valore memorizzato in una tupla, usi l'indice che corrisponde al valore che ti interessa.

var rate = currency.1 var message = time.1 var name = email.0

Xcode ci mostra gli indici di ciascun valore memorizzato in una tupla nel pannello dei risultati del parco giochi sulla destra.

nomi

Per migliorare la leggibilità, è possibile assegnare un nome ai valori memorizzati in una tupla. Il risultato è che è possibile accedere ai valori della tupla attraverso i loro nomi anziché i loro indici. Dichiarare una tupla è leggermente diversa in quel caso.

var currency = (nome: "EUR", tasso: 0.81) let currencyName = currency.name let currencyRate = currency.rate

Decomposizione

C'è un secondo, più elegante modo di lavorare con i valori memorizzati in una tupla. Dai un'occhiata al seguente esempio in cui decomponiamo il contenuto di moneta.

let (currencyName, currencyRate) = currency

Il valore di moneta all'indice 0 è memorizzato in CurrencyName, e il valore all'indice 1 è memorizzato in tasso di cambio. Non è necessario specificare il tipo per CurrencyName e tasso di cambio poiché Swift deduce il tipo dai valori memorizzati in moneta. In altre parole, CurrencyName è di tipo Stringa, e tasso di cambio è di tipo Galleggiante.

Se ti interessano solo i valori specifici di una tupla, puoi usare un trattino basso per dire a Swift quali valori non ti interessano.

let (currencyName, _) = valuta

Conclusione

Array e dizionari sono componenti fondamentali di quasi tutti i linguaggi di programmazione e Swift non è diverso. Mentre le raccolte si comportano in modo leggermente diverso in Swift, non ci vuole molto a familiarizzare con i tipi di raccolta di Swift se hai lavorato con matrici e dizionari in altri linguaggi di programmazione. Nel prossimo tutorial, esploreremo gli optionals e il controllo del flusso.

Impara Swift

Abbiamo creato una guida completa per aiutarti a imparare Swift, sia che tu stia appena iniziando con le basi o che desideri esplorare argomenti più avanzati.

Se desideri iniziare subito a utilizzare la lingua Swift, consulta il nostro corso sulla creazione di app iOS con Swift.

Oppure guarda alcuni dei nostri altri tutorial e corsi sullo sviluppo di Swift e iOS!