Os arrays são um dos três tipos de coleção principais do Swift. Um array é uma lista ordenada de elementos. Os arrays podem guardar elementos de qualquer tipo, mas todos os elementos de um dado array têm de ser do mesmo tipo. Os arrays são mutáveis quando são atribuídos a uma variável, o que significa que podes acrescentar, remover ou modificar elementos depois de criares o array. Quando são atribuídos a uma constante, os arrays são imutáveis, ou seja, o seu conteúdo não pode ser alterado.
Os literais de array escrevem-se como uma lista de elementos separados por vírgulas e entre parênteses retos ([...]).
O Swift consegue inferir o tipo do array a partir dos elementos que estão dentro do literal.
let evenInts = [2, 4, 6, 8, 10, 12]
var oddInts = [1, 3, 5, 7, 9, 11, 13]
let greetings = ["Hello!", "Hi!", "¡Hola!"]
Também podes especificar o tipo explicitamente.
Os tipos de array podem escrever-se de duas formas: Array<T> ou a sintaxe abreviada [T], em que T é o tipo dos valores que o array contém.
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!"]
Podes descobrir o número de elementos de um array através da sua propriedade count:
evenInts.count
// returns 6
Para criar um array vazio, tens de especificar o seu tipo. Podes fazê-lo com a sintaxe de inicialização de arrays ou com uma anotação de tipo explícita:
let emptyArray = [Int]()
let emptyArray2 = Array<Int>()
let emptyArray3: [Int] = []
Os arrays podem ser aninhados para criar arrays multidimensionais.
Ao especificar explicitamente o tipo de um array aninhado, coloca o tipo dos elementos dentro de parênteses retos aninhados, como em [[Int]] ou 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]]
Podes acrescentar um elemento ao fim de um array mutável com o método append(_:):
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.append(15)
// oddInts is now [1, 3, 5, 7, 9, 11, 13, 15]
Podes inserir um elemento numa posição específica com o método insert(_:at:).
Este método recebe dois argumentos: o elemento a inserir e o índice onde o queres inserir.
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]
Podes combinar dois arrays num só com o operador +.
O operador + cria e devolve um novo array; não modifica os arrays originais.
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]
Podes aceder a um elemento individual de um array colocando o seu índice entre parênteses retos ([]) a seguir ao nome do array.
Os índices dos arrays são valores Int que começam em zero, sendo 0 o primeiro elemento.
Aceder a um índice fora do intervalo válido provoca um erro em tempo de execução e faz o programa terminar abruptamente.
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
Podes alterar um elemento de um array mutável atribuindo um novo valor a um índice específico. Tal como ao ler elementos, usar um índice fora do intervalo válido provoca um erro em tempo de execução.
var evenInts = [2, 4, 6, 8, 10, 12]
evenInts[2] = 0
// evenInts is now [2, 4, 0, 8, 10, 12]
Podes juntar um array de strings numa única string com o método joined(separator:), que recebe uma string separadora:
let evenInts = ["2", "4", "6", "8", "10", "12"]
let evenIntsString = evenInts.joined(separator: ", ")
// returns "2, 4, 6, 8, 10, 12"
Podes dividir uma string num array de substrings com o método split(separator:), passando-lhe o caráter delimitador:
let evenIntsString = "2, 4, 6, 8, 10, 12"
let evenInts = evenIntsString.split(separator: ",")
// returns ["2", " 4", " 6", " 8", " 10", " 12"]
Podes remover um elemento numa dada posição com o método remove(at:).
O índice tem de estar dentro dos limites válidos do array; caso contrário, ocorre um erro em tempo de execução.
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.remove(at: 3)
// oddInts is now [1, 3, 5, 9, 11, 13]
Para remover o último elemento de um array, usa o método removeLast().
Chamar removeLast() a um array vazio provoca um erro em tempo de execução.
var oddInts = [1, 3, 5, 7, 9, 11, 13]
oddInts.removeLast()
// oddInts is now [1, 3, 5, 7, 9, 11]
Como futura ilusionista, a Elyse precisa de praticar o básico. Tem uma pilha de cartas que quer manipular.
Para facilitar um pouco as coisas, usa apenas as cartas de 1 a 10, para que a sua pilha de cartas possa ser representada por um array de números. A posição de uma determinada carta corresponde ao índice no array. Isto significa que a posição 0 corresponde à primeira carta, a posição 1 à segunda carta, e assim por diante.
Todas as funções devem atualizar o array de cartas e depois devolver o array modificado, uma forma comum de trabalhar conhecida como padrão Builder, que te permite encadear funções umas nas outras de forma harmoniosa.
Para escolheres uma carta, devolve a carta que está no índice position da pilha indicada.
Implementa a função getCard(at:from:), que recebe dois argumentos: at, que é a posição da carta na pilha, e from, que é a pilha de cartas.
A função deve devolver a carta que está na posição index da pilha indicada.
let index = 2
getCard(at: index, from: [1, 2, 4, 1])
// returns 4
Faz um pouco de prestidigitação e troca a carta no índice position pela carta de substituição indicada.
Implementa a função setCard(at:in:to), que recebe três argumentos: at, que é a posição da carta na pilha, in, que é a pilha de cartas, e to, que é a nova carta que vai substituir a carta na posição index.
A função deve devolver uma cópia da pilha com a carta na posição index substituída pela nova carta.
Se o index indicado não for um índice válido na pilha, deve devolver a pilha original, sem alterações.
let index = 2
let newCard = 6
setCard(at: index, in: [1, 2, 4, 1], to: newCard)
// returns [1, 2, 6, 1]
Faz aparecer uma carta, inserindo uma nova carta no topo da pilha.
Implementa a função insert(_:atTopOf:), que recebe dois argumentos: a nova carta a inserir e a pilha de cartas.
A função deve devolver uma cópia da pilha com a nova carta indicada adicionada ao topo da pilha.
let newCard = 8
insert(newCard, atTopOf: [5, 9, 7, 1])
// returns [5, 9, 7, 1, 8]
Faz desaparecer uma carta, removendo da pilha a carta que está na posição position indicada.
Implementa a função removeCard(at:from:), que recebe dois argumentos: at, que é a posição da carta na pilha, e from, que é a pilha de cartas.
A função deve devolver uma cópia da pilha com a carta na posição index removida.
Se o index indicado não for um índice válido na pilha, deve devolver a pilha original, sem alterações.
let index = 2
removeCard(at: index, from: [3, 2, 6, 4, 8])
// returns [3, 2, 4, 8]
Faz aparecer uma carta, inserindo uma nova carta na posição position indicada na pilha.
Implementa a função insert(_:at:from:), que recebe três argumentos: a nova carta a inserir, a posição na qual a nova carta deve ser inserida e a pilha de cartas.
A função deve devolver uma cópia da pilha com a nova carta indicada adicionada na posição indicada.
Se o index indicado não for um índice válido na pilha, deve devolver a pilha original, sem alterações.
let newCard = 8
insert(newCard, at: 2, from: [5, 9, 7, 1])
// returns [5, 9, 8, 7, 1]
Verifica se o tamanho da pilha é igual a stackSize ou não.
Implementa a função checkSizeOfStack(_:_:), que recebe dois argumentos: stack, que é a pilha de cartas, e stackSize, que é o tamanho da pilha.
A função deve devolver true se o tamanho da pilha for igual a stackSize e false caso contrário.
let stackSize = 4
checkSizeOfStack([3, 2, 6, 4, 8], stackSize)
// returns false
Inscreve-te no Exercism para aprenderes e dominares Swift com 35 conceitos116 exercícios, e mentoria humana real, tudo grátis.