Tipos de Coleção

Swift fornece três tipos primários de coleção (ou collections como dizemos frequentemente), conhecidos como arrays, sets e dictionaries, para armazenar coleções de valores. Arrays são coleções ordenadas de valores. Os Sets são collections não ordenadas de valores únicos e exclusivos. E os Dictionaries são collections não ordenadas de associações de chaves com valores.

Arrays, Sets e Dictionaries em Swift são sempre claros sobre os tipos de valores e chaves que eles podem armazenar. Isso significa que você não pode inserir um valor do tipo errado em uma coleção por engano, também significa que você pode ter certeza sobre o tipo de valores que você recuperará de uma coleção.

Nota

Os tipos Array, Set e Dictionary do Swift são implementados como collections genéricas. Para mais informações sobre Generics e coleções, veja a seção Generics.

Mutabilidade das Collections

Se você criar um Array , um Set ou um Dictionary e atribuí-lo a uma variável, a collection criada será mutable. Isso significa que você pode alterar (ou mutar) a collection depois que ela é criada adicionando, removendo ou alterando itens dela. Se você atribuir uma Array, um Set ou um Dictionary a uma constante, essa colllection é imutável e seu tamanho e conteúdo não podem ser alterados.

Nota

É uma boa prática criar collections imutáveis ​​em todos os casos em que ela não precisa ser alterada. Fazendo isso, torna-se mais fácil para você raciocinar sobre seu código e permite que o compilador do Swift otimize o desempenho das collections que você criou.

Arrays

Um Array armazena valores de um mesmo tipo em uma lista ordenada. O mesmo valor pode aparecer em um Array várias vezes em diferentes posições.

Nota

O tipo Array do Swift é conectado com a classe NSArray do framework Foundation. Para mais informações sobre como usar o tipo Array com o framework Foundation e Cocoa, veja a seção Trabalhando com tipos de dados Cocoa.

Atalho de sintaxe para o tipo Array

O tipo de um Array no Swift está escrito como Array<Element>, onde Element é o tipo de valores que o array pode armazenar. Você também pode escrever o tipo do array no formato abreviado como [Element]. Embora as duas formas sejam idênticas, a forma abreviada é preferida e é usada ao longo deste guia quando se refere ao tipo de um array.

Criando um Array vazio

Você pode criar um array vazio de um certo tipo utilizando a sintaxe de inicialização:

Note que o tipo da variável someInts é inferido como [Int] (array de inteiros) a partir do tipo do seu inicializador.

Alternativamente, se o contexto já fornece informações do tipo, como um argumento de função ou uma variável ou constante já declarada, você pode criar um array vazio com um literal de array vazio, que é escrito como [] (um par de colchetes vazios):

Criando um Array com valores padrão

O tipo Array do Swift também fornece um inicializador para criar um array a partir de um determinado tamanho com todos os seus valores definidos para o mesmo valor padrão. Você passa para este inicializador um valor padrão do tipo apropriado (chamado de repeating) e o número de vezes esse valor é repetido na nova matriz (chamado de count):

Criando um Array adicionando dois Arrays juntos

Você pode criar um novo Array adicionando dois arrays existentes com tipos compatíveis com o operador de adição +. O tipo do novo array é inferido do tipo dos dois arrays que você adiciona:

Criando um Array com um Array literal

Você também pode inicializar um Array com um array literal, que é uma maneira abreviada de escrever um ou mais valores como uma collection do tipo array. Um array literal é escrito como uma lista de valores, separados por vírgulas, cercados por um par de colchetes:

O exemplo abaixo cria um array chamado shoppingList para armazenar somente valores do tipo String.

A variável shoppingList é declarada como "um array de valores do tipo String" e escrita como [String]. Como esse array em particular especificou um valor do tipo String na sua criação, ele só permite que você insira valores desse tipo. Aqui, o array shoppingList é inicializado com dois valores do tipo String ("Eggs" e "Milk"), escritos como um array literal.

Nota

O array shoppingList é declarado como uma variável (com o comando var) e não como uma constante (com o comando let) porque mais itens serão adicionados na lista nos exemplos abaixo.

Neste caso, o array literal contém dois valores String e nada mais. Isso corresponde ao tipo da declaração da variável shoppingList (uma array que só pode conter valores do tipo String) e, portanto, a atribuição do array literal é permitida como uma forma de inicializar o shoppingList com dois itens iniciais.

Graças à inferência de tipo de Swift, você não precisa escrever o tipo do array se você estiver iniciando com um array literal contendo valores do mesmo tipo. A inicialização do shoppingList poderia ter sido escrita de uma forma mais curta em vez disso:

Como todos os valores no array literal são do mesmo tipo, o Swift pode inferir que [String] é o tipo correto a ser usado para a variável shopingList.

Acessando e modificando um Array

Você pode acessar e modificar um array através de seus métodos e propriedades, ou usando sintaxe de subscript. Para descobrir o número de itens de um array, utilize sua propriedade de leitura count:

Use sua propriedade booleana isEmpty como atalho para verificar se a propriedade count é igual a 0, o que indica que o array está vazio:

Voce pode adicionar um novo item no final do array usando o método append(_:) :

Alternativamente, você pode adicionar um array com ou mais itens compativeis no array com o operador de adição e atribuição +=:

Recupere um valor de um array usando a sintaxe de subscript, passando o índice do valor que deseja recuperar entre colchetes imediatamente após o nome da array:

Nota

O primeiro item dentro de um array tem o indice 0, não 1. Arrays no Swift sempre começam do indice zero.

Você pode usar a sintaxe de subscript para mudar um valor que já existe de um indice específico:

Quando você usa sintaxe de subscript, o índice que você especifica precisa ser um índice válido. Por exemplo, escrever shoppingList[shoppingList.count] = "Salt" para tentar anexar um item ao final do array resulta em um erro em tempo de execução.

Você também pode usar a sintaxe de subscript para alterar um range de valores em uma única vez, mesmo que o conjunto de valores de substituição tenha um tamanho diferente do range que você está substituindo. O exemplo a seguir substitui "Chocolate Spread", "Cheese" e "Butter" por "Bananas" e "Apples":

Para inserir um item dentro de um array em um índice específico, use o método insert(_: at:):

A chamada do método insert(_: at:) insere um novo item com o valor "Maple Syrup" exatamente no começo do array shoppingList, isto é indicado pelo índice 0.

De forma muito parecida, você pode remover um item de um array com o método remove(at:). Este método remove um item do array em um índice específico e retorna o item removido (apesar de que você pode ignorar o item retornado se você não precisar dele):

Nota

Se você tentar acessar ou modificar um valor para um índice que esteja fora dos limites existentes de um array, você lancará um erro de tempo de execução. Você pode verificar se um índice é válido antes de usá-lo comparando-o com a propriedade count de um array. O maior índice válido em um array é count - 1 porque os arrays são indexados a partir do 0. No entanto, quando count é 0 (o que significa que o array está vazio), não há índices válidos.

Todas as lacunas em um array são fechadas quando um item é removido e, portanto, o valor no índice 0 é novamente igual a "Six eggs":

Se você quiser remover o item final de um array, use o método removeLast() em vez do método remove(at :) para evitar a necessidade de consultar a propriedade count do array. Assim como o método remove(at :), removeLast() retorna o item removido:

Iterando sobre um Array

Você pode iterar sobre todo o conjunto de valores de um array com um comando de loop for-in:

Se você precisar do índice de cada item como um inteiro, e também seu valor, use o método enumerated() para iterar sobre o array. Para cada item no array, o método enumerated() retorna uma tupla composta por um número inteiro e o item. Os números inteiros começam no zero são contados de um em um para cada item. Se você enumerar em todo o array, esses números inteiros correspondem aos índices dos itens. Você pode decompor a tupla em constantes ou variáveis temporárias ​​como parte da iteração:

Para saber mais a respeito do comando de loop for-in, veja a seção Loop For-in.

Sets

Um Set(conjunto em português) pode armazenar valores distintos de um mesmo tipo em uma coleção sem ordem definida. Você pode usar um Set ao invés de um Array quando a ordem dos items dentro da coleção não é importante, ou quando você precisa ter certeza que um item só aparecerá uma única vez na coleção.

Nota

O tipo Set do Swift é conectado com a classe NSSet do framework Foundation. Para mais informações sobre como usar o tipo Set com o framework Foundation e Cocoa, veja a seção Trabalhando com tipos de dados Cocoa.

Hash Values para tipos armazenados dentro de Sets

Um tipo deve ser hashable para ser armazenado dentro de um Set, isto é, ele deve prover uma maneira para processar um hash value de si mesmo. Um hash value é um valor do tipo Int que deve ser o mesmo para todos os objetos que são considerados iguais. Assim, a comparação a == b, é o mesmo que a.hashValue == b.hashValue.

Todos os tipos básicos do Swift (como String, Int, Double e Bool) são hashable por padrão e podem ser usados como valores de um Set ou chaves para Dictionaries. Os blocos case de um Enum sem valores associados (como são descritos na seção de Enumerations) também são hashable por padrão.

Nota

Você pode usar seus próprios tipos personalizados como tipos para serem armazenados em um Set ou para serem keys de um Dictionary, fazendo-os implementar o protocolo Hashable da biblioteca padrão do Swift. Os tipos que implementam o protocolo Hashable devem fornecer uma propriedade de leitura do tipo Int chamada hashValue. O valor retornado pela propriedade hashValue de um tipo não precisa ser o mesmo em diferentes execuções do mesmo programa ou em programas diferentes.

Como o protocolo Hashable implementa o protocolo Equatable, os tipos que implementarem o Hashable também devem fornecer uma implementação do operador igual ==. O protocolo Equatable requer qualquer implementação para == para saber quando um tipo é igual ao outro ou não. Ou seja, uma implementação de == deve satisfazer as seguintes três condições, para todos os valores a, b e c:

  • a == a (Reflexividade)
  • a == b implica que b == a (Simetria)
  • a == b && b == c implica que a == c (Transitividade)

Para mais informações sobre implementação de protocolos , veja a seção de Protocols.

Sintaxe do tipo Set

O tipo Set no Swift é escrito como Set<Element>, onde Element é o tipo que o conjunto pode armazenar. Diferente dos arrays, os sets não possuem um atalho para serem escritos.

Criando e inicializando um Set vazio

Você pode criar um set vazio de um tipo específico usando a sintaxe de inicialização normal:

Nota

O tipo da variável letters é inferida para ser do tipoSet<Character> a partir do seu inicializador.

Alternativamente, se o contexto já fornece as informações do tipo do set, como um argumento de função ou uma variável ou constante já criada, você pode digitar um set vazio como se fosse um array literal vazio:

Criando um Set com um Array literal

Você também pode inicializar um set com um array literal como uma maneira mais rápida de escrever um ou mais valores como uma coleção do tipo Set. O exemplo abaixo cria um set chamado favoriteGenres para armazenar valores do tipo String:

A variável favoriteGenres é declarada como "um conjunto (set) de valores do tipo String" e escrito como Set<String>. Como esse set em particular especificou um valor do tipo String na sua criação, ele só permite que você insira valores desse tipo. Aqui, o set favoriteGenres é inicializado com três valores do tipo String ("Rock", "Classical" e "Hip Hop"), escritos como um array literal.

Nota

O set favoriteGenres é declarado como uma variável (com o comando var) e não como uma constante (com o comando let) porque itens serão adicionados e removidos dele nos exemplos abaixo.

O tipo Set não pode ser inferido a partir de um array literal sozinho, portanto, o Set precisa ser explicitamente declarado neste caso. Entretanto, devido ao type inference do Swift, você não precisa escrever o tipo que esse Set irá armazenar se você está inicializando ele com um array literal contendo valores de um único tipo. A inicialização da variável favoriteGenres pode ser escrita de uma forma mais curta:

Como todos os valores no array literal são do mesmo tipo, o Swift pode inferir que Set <String> é o tipo correto a ser usado para a variável favoriteGenres.

Acessando e modificando um Set

Você pode acessar e modificar um set através de seus métodos e propriedades. Para descobrir a quantidade de itens em um set, verifique sua propriedade de leitura count:

Use a propriedade booleana isEmpty como atalho para verificar se a propriedade count é igual a 0:

Voce pode adicionar um novo item dentro de um set usando o método insert(_:) :

Você pode remover um item de um set chamando o método remove(_ :) que remove o item se ele existir dentro do set e retorna o valor removido, ou retorna nil se o set não o conter. Alternativamente, todos os itens de um set podem ser removidos com o método removeAll().

Para verificar se um set contém um item específico, use o método contains(_:):

Iterando sobre um Set

Você pode iterar sobre os valores de um set usando o comando de loop for-in:

Para saber mais a respeito do comando de loop for-in, veja a seção Loop For-in.

O tipo Set do Swift não tem uma ordenação definida, portanto para iterar sobre os valores de um set em uma ordem específica, use o método sorted() que retorna os elementos do set como um array ordenado pelo o operador de menor < :

Executando operações em um Set

Você pode executar operações fundamentais de forma eficiente em um set, como combinar dois sets juntos, determinar quais valores dois sets têm em comum ou determinar se dois sets contêm todos, alguns ou nenhum dos mesmos valores.

Operações fundamentais em um Set

A ilustração abaixo descreve dois sets a e b com os resultados de várias operações representadas pelas regiões sombreadas.

  • Use o método intersection(_:) para criar um novo set com somente os valores comuns entre ambos os sets.
  • Use o método symmetricDifference(_:) para criar um novo set com os valores em cada set, mas não ambos.
  • Use o método union(_:) para criar um novo set com todos os valores em ambos os sets.
  • Use o método subtracting(_:) para criar um novo set com valores que não estão no set especificado.

Igualdade e Associação de Sets

A ilustração abaixo descreve três sets, a, b e c, com regiões que se sobrepoem representando elementos compartilhados entre os sets. O set a é um superset do set b, porque a contém todos os elementos deb. Por outro lado, o set b é um subset do set a, porque todos os elementos de b também estão contidos em a. O set b e o set c são disjuntos uns com os outros, porque eles não compartilham nenhum elementos em comum.

  • Use o operador de igualdade == para determinar se dois sets contém todos os mesmos valores.
  • Use o método isSubset(of:) para terminar se um set todos os valores de um set estão contidos em um outro set.
  • Use o método isSuperset(of:) para determinar se um set se um set contém todos os valores de um outro set em específico.
  • Use os métodos isStrictSubset(of:) ou isStrictSuperset(of:) para determinar se um set é um subset ou superset, mas não igual a um set em específico.
  • Use o método isDisjoint(with:) para determinar se dois sets não tem nenhum valor em comum.

Dictionaries

Um Dictionary (ou dicionário em português) armazena associações entre chaves de um mesmo tipo e valores também de um mesmo tipo em uma coleção sem ordenação definida. Cada valor está associado a uma chave exclusiva, que atua como um identificador desse valor dentro do dictionary. Ao contrário dos itens em um array, os itens em um dictionary não possuem uma ordem especifica. Você pode usar um dicionary quando é necessário pesquisar valores com base em seu identificador, da mesma forma que um dicionário do mundo real é usado para procurar a definição de uma determinada palavra.

Nota

O tipo Dictionary do Swift é conectado com a classe NSDictionary do framework Foundation. Para mais informações sobre como usar o tipo Dictionary com o framework Foundation e Cocoa, veja a seção Trabalhando com tipos de dados Cocoa.

Atalho de sintaxe para o tipo Dictionary

O tipo Dictionary do Swift é escrito como Dictionary<Chave, Valor>, onde Chave é o tipo de valor que pode ser usado como uma chave de dicionário e Valor é o tipo de valor que o dicionário armazena para essas chaves.

Nota

Uma chave de um Dictionary deve implementar o protocol Hashable, assim como o valor de um set.

Você também pode escrever uma variável do tipo de um Dictionary de uma forma abreviada como [Chave: Valor]. Embora as duas formas sejam funcionalmente idênticas, a forma abreviada é preferida e é usada ao longo deste guia quando se refere ao tipo de um dictionary.

Criando um Dictionary vazio

Assim como arrays, você pode criar um dicionary vazio de um tipo específico usando a sintaxe de inicialização:

Este exemplo cria um dicionary vazio do tipo [Int: String] para armazenar nomes legíveis por humanos de valores inteiros. Suas chaves são do tipo Int, e seus valores são do tipo String.

Se o contexto já fornece informações do tipo do dicionary, você pode criar um dictionary vazio com um dictionary literal vazio, que é escrito como [:] (dois pontos dentro de um par de colchetes):

Criando um Dictionary com um Dictionary literal

Você também pode inicializar um dictionary com um dictionary literal, que tem uma sintaxe semelhante a um array literal visto anteriormente. Um dictionary literal é uma maneira abreviada de escrever um ou mais pares de chave-valor como uma collection do tipo Dictionary.

Um par de chave-valor é uma combinação de uma chave e um valor. Em um dictionary literal, a chave e o valor em cada par chave-valor são separados por dois pontos. Os pares chave-valor são escritos como uma lista, separados por vírgulas, cercados por um par de colchetes:

O exemplo abaixo cria um dictionary para armazenar os nomes dos aeroportos internacionais. Neste dictionary, as chaves são códigos de três letras da International Air Transport Association, e os valores são nomes de aeroportos:

O dictionary airports é declarado como send do tipo [String: String], que significa "um dictionary cujas chaves são do tipo String e cujos valores são também do tipo String".

Nota

O dictionary airports é declarado como uma variável (com o comando var) e não como uma constante (com o comando let) porque aeroportos serão adicionados nos exemplos abaixo.

O dictionary airports é inicializado com um dictionary literal contendo dois pares de chave-valor. O primeiro par tem uma chave de "YYZ" e um valor de "Toronto Pearson". O segundo par tem uma chave de "DUB" e um valor de "Dublin".

Este dictionary literal contém dois pares do tipo String : String. Esse tipo de chave-valor corresponde ao tipo de declaração da variável airports (um dicionário com apenas chaves do tipo String e somente valores do tipo String) e, portanto, o dictionary literal é permitido como forma de inicializar o dictionary airoports com dois itens iniciais.

Assim como acontece com os arrays, você não precisa escrever o tipo do dictionary se você estiver iniciando com um dictionary literal cujas chaves e valores tenham tipos consistentes. A inicialização do airports poderia ter sido escrita de forma mais curta:

Como todas as chaves são do mesmo tipo String e como todos os valores também são do mesmo tipo String, o Swift infere que o tipo correto para ser usado para o dictionary airports é o [String : String

Acessando e modificando um Dictionary

Você pode acessar e modificar um dictionary através dos seus métodos e propriedades, ou usando a sintaxe de subscript. Assim como com arrays, você consegue descobrir a quantidade de items dentro de um dictionary acessando a sua propriedade de leitura count:

Use sua propriedade booleana isEmpty como atalho para verificar se a propriedade count é igual a 0, o que indica que o dictionary está vazio:

Você pode adicionar um novo item a um dictionary usando a sintaxe de subscript. Use uma nova chave do tipo correto dentro dos colchetes como um índice, e então atribua um valor do tipo correto com o operador de atribuição =.

Também é possível usar a sintaxe de subscript para mudar o valor associado a uma chave em particular:

Como alternativa para a sintaxe de subscript, use o método updateValue(_: forKey :) para setar ou atualizar o valor de uma chave específica. Como os exemplos usando subscript acima, o método updateValue(_: forKey :) seta um valor para uma chave se não existir, ou atualiza o valor se essa chave já existir. Ao contrário do subscript no entanto, o método updateValue(_: forKey :) retorna o valor antigo depois de executar uma atualização. Isso permite que você verifique se uma atualização ocorreu ou não.

O método updateValue(_: forKey :) retorna um valor opcional do tipo do valor do dictionary. Para um dictionary que armazena valores String, por exemplo, o método retorna um valor do tipo String?, ou "String optional". Este valor opcional contém o valor antigo dessa chave se existisse antes da atualização ou nil se nenhum valor existir.

Você também pode usar a sintaxe de subscript para recuperar um valor do dictionary para uma chave específica. Como é possível solicitar uma chave para a qual não existe nenhum valor, o subscript de um dictionary retorna um valor opcional do tipo de valor do dicionário. Se o dictionary contiver um valor para a chave solicitada, o subscript retorna um valor opcional que contém o valor existente para essa chave. Caso contrário, o subscript retornará nil:

Você pode usar a sintaxe de subscript para remover um par de chave-valor de um dictionary setando pra a chave o valor nil:

Alternativamente, você pode remover um par de chave-valor de um dictionary com o método removeValue(forKey :). Este método remove o par chave-valor se ele existe e retorna o valor removido, ou retorna nil se nenhum valor existir:

Iterando sobre um Dictionary

Você pode iterar sobre os pares de chave-valor em um dictionary com o comando de loop for-in. Cada item no dictionary é retornado como uma tupla de (chave, valor) e você pode decompor os membros da tupla em constantes ou variáveis temporárias ​​como parte da iteração:

Para saber mais a respeito do comando de loop for-in, veja a seção Loop For-in.

Também é possível recuperar uma coleção iterável de chaves de um dictionary ou de valores de um dictionary acessando suas propriedades keys e values:

Se você precisar usar as chaves ou valores de um dictionary com uma API que recebe um array, crie um novo array com as propriedades keysou values.

O tipo Dictionary do Swift não possui uma ordenação definida. Para iterar sobre as chaves ou valores de um dictionary em uma ordem específica, use o método sorted() em suas propriedades keys ou values.

results matching ""

    No results matching ""