Embora o Swift ofereça uma grande variedade de funcionalidades na sua biblioteca padrão, podes aceder a muitas funcionalidades adicionais importando bibliotecas e frameworks externos. Estes módulos podem vir diretamente do projeto Swift (como o Swift Argument Parser), das frameworks das plataformas da Apple (como a Foundation e a Network Framework), ou de bibliotecas open source de terceiros (como a SwiftyBeaver).
Os módulos principais, como a Foundation, que é uma das bibliotecas mais utilizadas em Swift, vêm incluídos na cadeia de ferramentas do Swift. As bibliotecas de terceiros têm de ser adicionadas à configuração do teu projeto (por exemplo, com o Swift Package Manager) antes de as poderes importar.
Importar módulos faz-se escrevendo a palavra-chave import seguida do nome do módulo.
Assim, podes importar a Foundation adicionando o seguinte ao teu programa.
import Foundation
Importar um módulo torna os seus tipos, métodos e funções acessíveis ao teu código.
Por exemplo, importar a Foundation estende o String com métodos utilitários úteis, como components(separatedBy:).
Por convenção, as instruções import colocam-se no topo de um ficheiro Swift, para que as dependências sejam imediatamente visíveis a quem lê o código.
Podes aceder a carateres individuais de uma String usando a mesma sintaxe de subscrito que se usa com os arrays.
No entanto, os índices usados nas strings não são números inteiros e não podem ser usados diretamente.
Em vez disso, têm de ser calculados a partir de outro índice conhecido, como o startIndex, que aponta para a posição do primeiro caráter de uma string não vazia, usando os métodos disponíveis nas bibliotecas String e NSString (quando o módulo Foundation está importado, as strings em Swift têm acesso a todas as propriedades e métodos de NSString).
Por exemplo, dada a seguinte string:
let csv = "apple,pear,peach,orange,cherry,lime,goosberry"
Não podes escrever csv[21] para obter o "g" de "orange"; tens de calcular um valor do tipo String.Index e fornecer esse índice.
Repara que estes índices não se destinam a ser consumidos por humanos por si só.
São aquilo a que se chama índices opacos, pois os humanos não precisam de saber o que está lá dentro.
let index = csv.index(csv.startIndex, offsetBy: 21)
csv[index]
// "g"
print(index)
// prints Index(_rawBits: 1376513)
Repara, no entanto, que se o deslocamento não for um índice válido, ou seja, se devolver o índice antes do startIndex ou depois do endIndex, a operação provoca um erro que faz o programa rebentar.
Para evitar este problema, podes especificar um índice limite.
Isto devolve um índice opcional e devolverá nil para índices que, de outra forma, seriam inválidos.
let tooFar = csv.index(csv.startIndex, offsetBy: 200)
// error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
let tooFarButSafe = csv.index(csv.startIndex, offsetBy: 200, limitedBy: csv.endIndex)
// nil
Além disso, os índices não podem ser partilhados entre strings.
Por exemplo, usar o index do "g" de "orange" calculado acima para indexar a string fam = "This is my family: 👨👩👦👦, this is our dog: 🐶, this is our cat: 🐱!", ou seja, fam[index], fará o teu programa rebentar.
Há muitas razões para tudo isto, mas, no fundo, resumem-se todas à ideia de que o Unicode é complicado.
De um modo geral, se precisares de acesso aleatório a carateres individuais, provavelmente queres usar outra estrutura de dados, como Array<Character>.
O Swift tem os métodos first e last para obter o primeiro e o último caráter de uma string.
Estes métodos devolvem um caráter opcional, por isso, se a string estiver vazia, devolvem nil.
let str = "Hello, world!"
print(str.first) // Prints Optional("H")
print(str.last) // Prints Optional("!")
Também podes usar os métodos prefix e suffix para obter uma substring de uma string.
Estes métodos recebem um número inteiro como argumento e devolvem uma substring com os primeiros ou os últimos n carateres da string.
let str = "Hello, world!"
print(str.prefix(5)) // Prints "Hello"
print(str.suffix(6)) // Prints "world!"
Trabalhar com texto é uma tarefa comum em programação. O Swift, juntamente com a framework Foundation, disponibiliza muitos métodos e propriedades práticos para inspecionar, transformar e manipular strings.
components(separatedBy:)
Para dividir uma string num array de substrings com base num delimitador, usa components(separatedBy:) (é preciso importar a Foundation):
import Foundation
let sentence = "Hello, world!"
let words = sentence.components(separatedBy: " ")
print(words) // Prints ["Hello,", "world!"]
hasPrefix(_:) e hasSuffix(_:)
Para verificar se uma string começa ou termina com uma determinada sequência de carateres, usa hasPrefix(_:) e hasSuffix(_:):
let greeting = "Hello, world!"
print(greeting.hasPrefix("Hello")) // Prints true
print(greeting.hasSuffix("world!")) // Prints true
Podes transformar as maiúsculas e minúsculas de uma string com estes métodos e propriedades padrão:
lowercased(): Devolve uma cópia da string em minúsculas.uppercased(): Devolve uma cópia da string em maiúsculas.capitalized: Devolve uma cópia em que a primeira letra de cada palavra fica em maiúscula (da Foundation).let greeting = "hello, world!"
print(greeting.lowercased()) // Prints "hello, world!"
print(greeting.uppercased()) // Prints "HELLO, WORLD!"
print(greeting.capitalized) // Prints "Hello, World!"
replacingOccurrences(of:with:)
Para substituir todas as ocorrências de uma substring por outra string, usa replacingOccurrences(of:with:) (da Foundation):
let greeting = "Hello, world!"
let updated = greeting.replacingOccurrences(of: "world", with: "Swift")
print(updated) // Prints "Hello, Swift!"
joined(separator:)
O método joined(separator:) pertence a coleções de strings, como [String].
Junta elementos numa única string usando um separador:
let words = ["Hello", "world"]
let sentence = words.joined(separator: ", ")
print(sentence) // Prints "Hello, world"
Um novo clube de poesia abriu na cidade e estás a pensar em ir. Como já houve incidentes no passado, o clube tem uma política de entrada muito específica que tens de dominar antes de tentares entrar.
Há duas portas no clube de poesia, ambas vigiadas. Para conseguires entrar, tens de descobrir a palavra-passe desse dia:
A primeira coisa que tens de fazer é dividir o poema em linhas individuais. O guarda vai recitar um poema, e vais ter de o dividir em linhas.
Implementa a função splitOnNewlines que recebe uma string e a divide num array de strings, usando o caráter de nova linha como delimitador.
A função deve devolver um array de strings, em que cada string é uma linha do poema.
splitOnNewlines("Hello.\nHow are you?\n\nI'm doing fine.")
// returns ["Hello." ,"How are you?", "", "I'm doing fine"].
_ em vez disso.Por exemplo, um dos escritores preferidos deles é Michael Lockwood, que escreveu o seguinte poema acróstico, o que significa que a primeira letra de cada frase forma uma palavra:
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
Quando o guarda recitar o poema, vais dividi-lo em linhas individuais e responder com as primeiras letras de cada linha, ou seja, ["S", "H", "I", "R", "E"].
O guarda vai depois dar-te a palavra formada pelo array de letras com que respondeste, para a colocares em maiúsculas.
Por fim, a palavra-passe que devolves é "SHIRE", e podes entrar.
Implementa a função frontDoorPassword que recebe uma string que representa o poema.
A função deve devolver a palavra-passe que darias ao guarda.
frontDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "SHIRE"
Na parte de trás do clube encontras os poetas mais prestigiados, que é como a zona VIP. Como isto não é para todos, o processo da porta de trás é um pouco mais complicado.
", please" ao fim da palavra formada pelas letras.Por exemplo, o poema mencionado antes também é teléstico, o que significa que a última letra de cada frase forma uma palavra:
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
Quando o guarda recitar o poema, vais dividi-lo em linhas individuais, remover os espaços à direita e responder com as últimas letras de cada linha, ou seja, ["h", "o", "r", "s", "e"].
O guarda vai depois dar-te a palavra formada pelo array de letras com que respondeste, para a colocares em maiúsculas e acrescentares ", please".
Por fim, a palavra-passe que devolves é "horse, please", e podes entrar.
Implementa a função backDoorPassword que recebe uma string que representa o poema.
A função deve devolver a palavra-passe que darias ao guarda.
backDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "horse, please"
Dentro da sala de trás do clube há outra porta que dá para a sala secreta, onde só os poetas de topo podem entrar.
"!" ao fim da palavra formada pelas letras.Por exemplo, uma versão modificada do poema mencionado antes encaixa neste padrão:
Stands so high
Huge hooves too
Impatiently waits for
Rider with harness
Eager to leave
Quando o guarda recitar o poema, vais dividi-lo em linhas individuais, remover os espaços à direita e responder com as iésimas letras de cada linha, ou seja, ["S", "u", "p", "e", "r"].
O guarda vai depois dar-te a palavra formada pelo array de letras com que respondeste, para a colocares em maiúsculas e acrescentares "!".
Por fim, a palavra-passe que devolves é SUPER!, e podes entrar.
Implementa a função secretRoomPassword que recebe uma string que representa o poema.
A função deve devolver a palavra-passe que darias ao guarda.
secretRoomPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nRider with harness\nEager to leave")
// returns "SUPER!"
Inscreve-te no Exercism para aprenderes e dominares Swift com 35 conceitos116 exercícios, e mentoria humana real, tudo grátis.