Quaddro + MacMagazine: Swift na prática #3 — String e Collection Types

por Leandro Cissoto

Publicidade

Dando continuidade à nossa série com 10 tutoriais Quaddro + MacMagazine sobre Swift, hoje vamos falar sobre o tipo String e Collection Types, faremos mais um exercício guiado e teremos um desafio para vocês. Então vamos nessa, porque este post vai ser longo e muito importante!

Ícone da Swift

Lembrando que, para testar os conceitos aqui apresentados, recomendamos o uso do Xcode 6 ou superior.


Ícone do app Xcode

Xcode

de Apple

Compatível com Macs
Versão 12.0.1 (11.2 GB)
Requer o macOS 10.15.4 ou superior

Se você não possui um Mac ou não quer instalar o Xcode, é possível utilizar uma ferramenta online que permite escrever em Swift diretamente pelo navegador. Agora não há mais desculpas para não começarmos a programar em Swift! 😉

Teoria

Apesar da importância de se trabalhar com números para realizarmos operações, a maioria das linguagens modernas tem dado uma atenção especial para as Strings e as Coleções, visando facilitar cada vez mais a vida do programador para trabalhar com esses tipos e fornecendo poderosas ferramentas para manipular suas informações. Vamos então conhecer um pouco mais sobre eles.

Strings e Character

Publicidade

Os tipos String e Character são utilizados para gerenciar informações de texto. Uma String na verdade é formada por um conjunto de Characters para formar uma palavra, uma frase ou um texto. Podemos utilizá-los para atribuirmos valores em nomes, endereços, emails, sites, um artigo em um blog ou qualquer coisa que exija um texto/frase. Ambos os tipos fazem uso das aspas duplas — “” — para sua declaração.

Exemplo:

Publicidade
//Declarando uma string vazia
let strVazia = ""

//Declarando outra String vazia
let outraVazia = String()
	
//Declarando uma String com um texto
let texto = "Eu sou um texto declarado na criação"

Quando utilizado em Strings, o sinal de + serve como operador de concatenação. Quando dizemos que estamos concatenando uma String, estamos unindo o seu conteúdo com o de outra String, conforme podemos observar no exemplo abaixo:

//Concatenando o texto utilizando o operador +
var concatena = "Começo do texto " + " concatenado."

//Outra forma de concatenar o texto
concatena += " Por Amanda Tutankhamun"

Podemos utilizar operadores de comparação para verificarmos se um determinado texto ou caractere é igual, maior ou menor do que outro.

Publicidade
//Comparando textos
var nome = "Danilo"
var outroNome = "Leandro"

(nome == outroNome)
(nome != outroNome)
(nome > outroNome)
(nome < outroNome)

Quando declaramos uma variável ou constante usando aspas duplas, o compilador entende que está sendo declarada uma String. Para declararmos um Character, precisamos especificar um tipo explicitamente.

Exemplo:

//Compilado como uma String
var umaString = ""

//Declarando um Character
var umChar: Character = "a"

//Outra forma
var outroChar = Character("U")

Podemos utilizar \u{} para criarmos caracteres Unicode.

Exemplo:

//Criando um Character usando Unicode
let caracter2: Character = "\u{24}"

//Criando um coração usando Unicode
let caracter3 = "\u{2665}"

//Criando Yin Yang usando Unicode
let caracter4 : Character = "\u{262F}"

Como já vimos no último artigo, podemos interpolar textos variáveis utilizando o Caracter \().

println("Você está equilibrado? \(caracter4)")

println("Cuide bem do seu dinheiro \(caracter2)")

Collection Types

As Collection Types são tipos de dados que armazenam coleções de um tipo determinado. A Swift apresenta três tipos de Collection Types: Array, Dicionários e Set.

Array

Um array armazena valores de um mesmo tipo em uma lista ordenada por índices. Dois valores idênticos podem ser inseridos dentro de um mesmo array desde que estejam em posições diferentes. Fazendo uma analogia com o mundo real, podemos dizer que um array pode ser comparado com um armário de gavetas numeradas; as posições de um array são essas gavetas identificadas por um número, que chamamos de índice. Quando desejamos resgatar um determinado item ou valor, acessamos diretamente a gaveta (índice) que o contém.

Nota: quando declaramos um Array com o tipo AnyObject, podemos converter o seu valor para outro tipo utilizando Down Casting, que veremos em postagens futuras.

Para declararmos um array, basta utilizarmos colchetes [] e o tipo de dado que o array armazenará, ou adicionar os itens dentro dos colchetes, separados por uma vírgula.

Exemplo:

//Inicializando um array com itens
var flutuantes = [10.4, 11.2, 9.5]

//Acessando a primeira posição do Array
flutuantes[0]

//Acessamos um range dentro do Array
flutuantes[1...2]

//Inicializando um array
var inteiros = [Int]()
var strings = [String]()

//Adicionando itens em um Array
inteiros.append(1)
inteiros.append(10)
inteiros.append(2)

strings.append("Amanda Tutankhamun")
strings.append("Danilo Cissoto")
strings.append("Leandro Altheman")

Repare no exemplo anterior que criamos um array vazio e utilizamos a função append para adicionar elementos dentro do array.

Nota: todo array tem como primeira posição de índice o valor zero.

Por padrão, todos os Arrays são mutáveis e podem ser alterados, desde que sejam declarados como variáveis. Também é possível adicionar ou remover um elemento em uma determinada posição, contar quantos elementos temos em um determinado array, bem como remover todos os elementos de um.

//Adicionando um elemento
strings.insert("Soraia Melare", atIndex: 3)

//Contar quantos elementos existem
strings.count

//Removendo um elemento
strings.removeAtIndex(0)

//Remover todos os elementos
strings = []

Dicionário

Dicionários, assim como o Array, armazenam valores de um determinado tipo. A grande diferença é que Dicionários são coleções que utilizam chaves únicas e não dão garantia de que os dados serão armazenados em ordem. Basicamente o Dicionário faz uma associação chave-valor, na qual a chave e o valor podem ser de qualquer tipo. 
Diferentemente do Array, onde podemos inserir os valores separados por vírgulas ao declaramos uma variável ou constante, o Dicionário exige uma chave para identificarmos um determinado valor. Para declarar um dicionário, utilizamos a seguinte sintaxe: var dicionario = [chave: valor, outraChave: outroValor, ...].

Exemplo:

//Declarando um dicionário
var carros = ["Volkswagen": "Gol", "Fiat": "Palio", "Ford": "Fiesta"]

//Acessando um valor do dicionário
carros["Fiat"]

É possível declarar um Dicionário de forma explícita, indicando qual será o tipo de chave e de valor que ele receberá.

Exemplo:

//Declarando explicitamente um dicionário
var maisCarros: Dictionary<String, String> = ["Volkswagen": "Gol", "Fiat": "Palio", "Ford": "Fiesta"]

Assim como no Array, os Dicionários declarados como variáveis são mutáveis, ou seja, podemos alterar seus valores se for necessário. Os Dicionários também possuem uma série de métodos que facilitam a vida do desenvolvedor para manejar seus elementos.

Exemplo:

//Alterando um valor de uma determinada chave
carros["Volkswagen"] = "Jetta"
  
//Removendo um valor de uma determinada chave
carros.removeValueForKey("Fiat")

//Conta quantos elementos existem no dicionários
carros.count

//Remove todos os elementos de um dicionário
carros.removeAll(keepCapacity: false)

Set

O tipo Set é uma lista sem ordem e sem valores repetidos. A sua grande diferença em relação ao Array é exatamente o fato de ser uma lista desordenada e por necessariamente possuir valores únicos, além de maior performance se comparado aos Arrays. Assim como os outros Collection Types, o tipo Set é mutável e permite a gestão de seus elementos.

Exemplo:

//Inicializando um Set
var meuSet = Set<String>()

//Iniciando um set a partir de um array literal
var letrasSet = Set(["L", "E", "C", "O"])
	
//Verifica se existe um elemento
letrasSet.contains("L")

//Insere um novo valor
letrasSet.insert("D")

//Retorna o total de elementos
letrasSet.count

//Verifica se está vazio
letrasSet.isEmpty

//Remove um valor
letrasSet.remove("L")

//Remove todos os valores
letrasSet.removeAll()

Exercício guiado

Vamos experimentar o conteúdo apresentado em um exercício guiado no qual usaremos String, Arrays, Dicionários e Set.

  1. Crie um novo Playground com o nome "StringCollectionTypes" e deixe o projeto em branco.

Swift #3: String e Collection Types

  1. Vamos declarar uma variável do tipo String e concatená-la para formarmos um pequeno texto.
//Declarando a variável e já iniciando com um texto
var texto = "Bom dia, "

//Concatenamos com complementos
texto += "Hoje o dia será ensolarado com "
texto += "a máxima será de \(temperatura) graus)"
texto += " com possibilidade de chuva "

//Outra forma de concatenar 
texto = texto + "durante a tarde"

println(texto)

Neste momento, o nosso código encontra-se assim:

Swift #3: String e Collection Types

  1. Vamos imaginar um array que servirá de cardápio. Assim nossos clientes podem escolher através do número. Veja o código abaixo:
/* 
MENU
    0 -> Churros
    1 -> Hotdog
    2 -> Salada
    3 -> Fritas
*/
var cardapio = ["Churros", "Hotdog", "Salada", "Fritas"]

println("Temos \(cardapio.count) opções no cardápio")

Nosso Playground ficou assim:

Swift #3: String e Collection Types

  1. Agora vamos imaginar que um novo gerente foi contratado e quis adicionar hambúrguer e milk-shake, mas resolveu retirar o hot-dog. Vamos ver como essa operação pode ser feita em nosso código:
//Adicionando um novos itens no cardápio
cardapio.append("Hambúrguer")
cardapio.append("Milkshake")

//Removendo os o Hotdog no índice 1
cardapio.removeAtIndex(1)

println("Agora temos \(cardapio.count) opções")

Swift #3: String e Collection Types

Agora o nosso menu passou por uma atualização. Como removemos um elemento do Array, os que ocupavam posições maiores tem seus índices reduzidos. No caso, a salada vai ocupar a posição do hot-dog no índice; e as fritas, a posição da salada, seguidas pelo hambúrguer e milk-shake. Agora nosso menu ficará assim:

/*
MENU
0 -> Churros
1 -> Salada
2 -> Fritas
3 -> Hambúrguer
4 -> Milkshake
*/
  1. Já que temos nosso cardápio consolidado, vamos criar um Dicionário com os pedidos dos nossos clientes.
//Criando nosso dicionario de pedidos
var clientes = ["Cliente1": 0]
clientes["Cliente2"] = 3
clientes["Cliente3"] = 1
clientes["Cliente4"] = 2

println("Estamos com \(clientes.count) clientes")

Swift #3: String e Collection Types

  1. O cardápio e os pedidos dos clientes, vamos juntar tudo e exibir o que cada um pediu.
//Exibindo os pedidos dos clientes
println("O cliente1 pediu " + cardapio[clientes["Cliente1"]!])
println("O cliente2 pediu " + cardapio[clientes["Cliente2"]!])
println("O cliente3 pediu " + cardapio[clientes["Cliente3"]!])
println("O cliente4 pediu " + cardapio[clientes["Cliente4"]!])

Swift #3: String e Collection Types

Nota: utilizamos uma exclamação após a chave do Dicionário para desempacotarmos seu conteúdo. O nome disso é force-unwrap, que veremos em mais detalhes quando chegarmos em Optional Chaining.

  1. Agora que já vimos Arrays e Dicionários, vamos entender como o Set funciona. Vamos declarar uma variável que contém algumas letras do alfabeto e trabalhar com elas.
//Declarando uma coleção do tipo Set
var abc = Set(["A","B", "C", "D", "E", "F"])

//Não irá inserir, pois o elemento já existe
abc.insert("A")

//Vai funcionar, pois o elemento não existia
abc.insert("L")

//Removendo o elemento
abc.remove("B")

println("Nosso abc tem \(abc.count)")

Swift #3: String e Collection Types

Desafio

Vamos começar a partir deste artigo uma série de desafios para fixar ainda mais o conteúdo. Os desafios são uma forma interessante de reter o conhecimento enquanto exploramos as possibilidades daquilo que foi aprendido. Então vamos lá.

Desafio média escolar

A ideia é fazer um algoritmo que seja capaz de receber algumas notas e computar o resultado final. Para isso, existem algumas regras de negócio.

  • São 4 bimestres.
  • Cada bimestre tem 3 provas. Logo, para conseguirmos a média do bimestre, precisamos da média dessas 3 provas.
  • O valor de cada prova é de 0 a 10.
  • Precisamos dizer se o aluno passou de ano baseado na média da nota dos 4 bimestres.
  • A média da escola é 6.

Regras:

  1. Utilizar o append.
  2. Utilizar o count.
  3. Utilizar o operador ternário.

Criar um Dicionário chamado "anoLetivo", no qual as chaves serão: 1bim, 2bim, 3bim e 4bim, sendo que a nota de cada bimestre é composta pela média das 3 provas que compõem o bimestre.

Dica: utilize Array para as notas das provas de cada bimestre.

No mundo da programação, na maioria das vezes não existe apenas uma solução para um problema — então sejam criativos! 🙂 A nossa solução para este desafio você encontra no nosso GitHub. Também por lá você encontrará os exercícios guiados de todos os artigos.

Hoje ficamos por aqui. No próximo artigo falaremos de tuplas e condicionais, até lá!

Posts relacionados

Comentários

Carregando os comentários…