Track
/
Swift
Swift
/
Esercizi
/
Apprendista mago
Apprendista mago

Apprendista mago

Esercizio di apprendimento

Introduzione

Gli array sono uno dei tre tipi di collezione principali di Swift. Un array è una lista ordinata di elementi. Gli array possono contenere elementi di qualsiasi tipo, ma tutti gli elementi di un dato array devono avere lo stesso tipo. Gli array sono mutabili quando vengono assegnati a una variabile: puoi aggiungere, rimuovere o modificare elementi dopo aver creato l'array. Quando vengono assegnati a una costante, un array è immutabile: il suo contenuto non può essere modificato.

I letterali di array si scrivono come un elenco di elementi separati da virgole, racchiuso tra parentesi quadre ([...]). Swift può dedurre il tipo dell'array dagli elementi all'interno del letterale.

let evenInts = [2, 4, 6, 8, 10, 12]
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let greetings = ["Hello!", "Hi!", "¡Hola!"]

Puoi anche specificare il tipo in modo esplicito. I tipi array si possono scrivere in due modi: Array<T> oppure la sintassi abbreviata [T], dove T è il tipo dei valori contenuti nell'array.

let evenInts: Array<Int> = [2, 4, 6, 8, 10, 12]
var oddInts: [Int] = [1, 3, 5, 7, 9, 11, 13]
let greetings: [String] = ["Hello!", "Hi!", "¡Hola!"]

Dimensione di un array

Puoi trovare il numero di elementi di un array usando la sua proprietà count:

evenInts.count
// returns 6

Array vuoti

Per creare un array vuoto, devi specificarne il tipo. Puoi farlo usando la sintassi di inizializzazione dell'array o un'annotazione di tipo esplicita:

let emptyArray = [Int]()
let emptyArray2 = Array<Int>()
let emptyArray3: [Int] = []

Array multidimensionali

Gli array possono essere annidati per creare array multidimensionali. Quando specifichi esplicitamente il tipo di un array annidato, racchiudi il tipo dell'elemento tra parentesi annidate, come [[Int]] o Array<Array<Int>>:

let multiDimArray = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let multiDimArray2: [[Int]] = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Aggiungere elementi a un array

Puoi aggiungere un elemento alla fine di un array mutabile usando il metodo append(_:):

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.append(15)
// oddInts is now [1, 3, 5, 7, 9, 11, 13, 15]

Inserire elementi in un array

Puoi inserire un elemento in una posizione specifica usando il metodo insert(_:at:). Questo metodo accetta due argomenti: l'elemento da inserire e l'indice in cui inserirlo.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.insert(0, at: 0)
// oddInts is now [0, 1, 3, 5, 7, 9, 11, 13]

Sommare due array

Puoi combinare due array in un unico array usando l'operatore +. L'operatore + crea e restituisce un nuovo array; non modifica gli array originali.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
let combined = oddInts + [15, 17, 19]
// combined is [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

print(oddInts)
// prints [1, 3, 5, 7, 9, 11, 13]

Accedere agli elementi di un array

Puoi accedere a un singolo elemento di un array inserendo il suo indice tra parentesi quadre ([]) dopo il nome dell'array. Gli indici degli array sono valori Int che partono da zero, con 0 per il primo elemento. Accedere a un indice fuori dall'intervallo valido causa un errore a runtime e fa crashare il programma.

let evenInts = [2, 4, 6, 8, 10, 12]
let oddInts = [1, 3, 5, 7, 9, 11, 13]

evenInts[2]
// returns 6

oddInts[7]
// Fatal error: Index out of range

Modificare gli elementi di un array

Puoi cambiare un elemento in un array mutabile assegnando un nuovo valore a un indice specifico. Come per la lettura degli elementi, usare un indice fuori dall'intervallo valido causa un errore a runtime.

var evenInts = [2, 4, 6, 8, 10, 12]

evenInts[2] = 0
// evenInts is now [2, 4, 0, 8, 10, 12]

Convertire un array in una stringa e viceversa

Puoi unire un array di stringhe in un'unica stringa usando il metodo joined(separator:), che accetta una stringa separatore:

let evenInts = ["2", "4", "6", "8", "10", "12"]
let evenIntsString = evenInts.joined(separator: ", ")
// returns "2, 4, 6, 8, 10, 12"

Puoi dividere una stringa in un array di sottostringhe usando il metodo split(separator:), passando il carattere delimitatore:

let evenIntsString = "2, 4, 6, 8, 10, 12"
let evenInts = evenIntsString.split(separator: ",")
// returns ["2", " 4", " 6", " 8", " 10", " 12"]

Rimuovere elementi da un array

Puoi rimuovere un elemento in una data posizione usando il metodo remove(at:). L'indice deve rientrare nei limiti validi dell'array; altrimenti si verifica un errore a runtime.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.remove(at: 3)
// oddInts is now [1, 3, 5, 9, 11, 13]

Per rimuovere l'ultimo elemento di un array, usa il metodo removeLast(). Chiamare removeLast() su un array vuoto causa un errore a runtime.

var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.removeLast()
// oddInts is now [1, 3, 5, 7, 9, 11]

Istruzioni

Come aspirante maga, Elyse deve esercitarsi con le basi. Ha un mazzo di carte che vuole manipolare.

Per semplificare un po' le cose, usa solo le carte da 1 a 10, così il suo mazzo di carte può essere rappresentato da un array di numeri. La posizione di una carta corrisponde all'indice nell'array. Questo significa che la posizione 0 si riferisce alla prima carta, la posizione 1 alla seconda, e così via.

Note

Tutte le funzioni dovrebbero aggiornare l'array di carte e poi restituire l'array modificato: un modo di lavorare comune noto come Builder pattern, che permette di concatenare le funzioni tra loro in modo elegante.

1. Recuperare una carta da un mazzo

Per pescare una carta, restituisci la carta all'indice position del mazzo dato.

Implementa la funzione getCard(at:from:) che accetta due argomenti: at, cioè la posizione della carta nel mazzo, e from, cioè il mazzo di carte. La funzione dovrebbe restituire la carta alla posizione index del mazzo dato.

let index = 2
getCard(at: index, from: [1, 2, 4, 1])
// returns 4

2. Cambiare una carta nel mazzo

Fai un po' di gioco di prestigio e scambia la carta all'indice position con la carta sostitutiva fornita.

Implementa la funzione setCard(at:in:to) che accetta tre argomenti: at, cioè la posizione della carta nel mazzo, in, cioè il mazzo di carte, e to, cioè la nuova carta che sostituisce quella alla posizione index. La funzione dovrebbe restituire una copia del mazzo con la carta alla posizione index sostituita dalla nuova carta. Se l'indice passato in index non è valido nel mazzo, va restituito il mazzo originale, invariato.

let index = 2
let newCard = 6
setCard(at: index, in: [1, 2, 4, 1], to: newCard)
// returns [1, 2, 6, 1]

3. Inserire una carta in cima al mazzo

Fai apparire una carta inserendo una nuova carta in cima al mazzo.

Implementa la funzione insert(_:atTopOf:) che accetta due argomenti: la nuova carta da inserire ed il mazzo di carte. La funzione dovrebbe restituire una copia del mazzo con la nuova carta fornita aggiunta in cima al mazzo.

let newCard = 8
insert(newCard, atTopOf: [5, 9, 7, 1])
// returns [5, 9, 7, 1, 8]

4. Rimuovere una carta dal mazzo

Fai sparire una carta rimuovendo dal mazzo la carta alla posizione indicata da position.

Implementa la funzione removeCard(at:from:) che accetta due argomenti: at, cioè la posizione della carta nel mazzo, e from, cioè il mazzo di carte. La funzione dovrebbe restituire una copia del mazzo con la carta alla posizione index rimossa. Se l'indice passato in index non è valido nel mazzo, va restituito il mazzo originale, invariato.

let index = 2
removeCard(at: index, from: [3, 2, 6, 4, 8])
// returns [3, 2, 4, 8]

5. Inserire una carta nel mazzo

Fai apparire una carta inserendo una nuova carta alla posizione indicata da position nel mazzo.

Implementa la funzione insert(_:at:from:) che accetta tre argomenti: la nuova carta da inserire, la posizione in cui va inserita ed il mazzo di carte. La funzione dovrebbe restituire una copia del mazzo con la nuova carta fornita aggiunta alla posizione indicata. Se l'indice passato in index non è valido nel mazzo, va restituito il mazzo originale, invariato.

let newCard = 8
insert(newCard, at: 2, from: [5, 9, 7, 1])
// returns [5, 9, 8, 7, 1]

6. Controllare la dimensione del mazzo

Verifica se la dimensione del mazzo è uguale a stackSize oppure no.

Implementa la funzione checkSizeOfStack(_:_:) che accetta due argomenti: stack, cioè il mazzo di carte, e stackSize, cioè la dimensione del mazzo. La funzione dovrebbe restituire true se la dimensione del mazzo è uguale a stackSize, e false altrimenti.

let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
Swift Exercism

Vuoi iniziare Apprendista mago?

Iscriviti a Exercism per imparare e padroneggiare Swift con 35 concetti116 esercizi e il mentoring di persone reali, tutto gratis.