Si bien Swift ofrece una gran funcionalidad en su biblioteca estándar, puedes acceder a muchas funcionalidades adicionales importando bibliotecas y frameworks externos. Estos módulos pueden venir directamente del proyecto Swift (como Swift Argument Parser), de frameworks de las plataformas de Apple (como Foundation y Network Framework), o de bibliotecas de código abierto de terceros (como SwiftyBeaver).
Los módulos principales como Foundation, una de las bibliotecas más usadas en Swift, vienen incluidos con la cadena de herramientas de Swift. Las bibliotecas de terceros deben agregarse a la configuración de tu proyecto (por ejemplo, con Swift Package Manager) antes de poder importarlas.
Para importar módulos, se escribe la palabra clave import seguida del nombre del módulo.
Así, puedes importar Foundation agregando lo siguiente a tu programa.
import Foundation
Importar un módulo hace que sus tipos, métodos y funciones estén disponibles en tu código.
Por ejemplo, al importar Foundation se extiende String con métodos de utilidad útiles como components(separatedBy:).
Por convención, las sentencias import se colocan al principio de un archivo de Swift para que las dependencias sean visibles de inmediato para cualquiera que lea el código.
Se puede acceder a los caracteres individuales de un String usando el método de subíndices que se usa con los arrays.
Sin embargo, los índices que se usan con los strings no son enteros y no se puede trabajar con ellos directamente.
En su lugar, hay que calcularlos a partir de algún otro índice conocido, como startIndex, que apunta a la posición del primer carácter de un string no vacío, usando los métodos disponibles en las bibliotecas String y NSString (cuando se importa el módulo Foundation, los strings de Swift tienen acceso a todas las propiedades y métodos de NSString).
Por ejemplo, dado el siguiente string:
let csv = "apple,pear,peach,orange,cherry,lime,goosberry"
No puedes escribir csv[21] para obtener la «g» de «orange»; en su lugar, debes calcular un valor de tipo String.Index y pasar ese índice.
Ten en cuenta que estos índices no están pensados para que los lea una persona directamente.
Son lo que se conoce como índices opacos, ya que las personas no necesitan saber qué hay dentro de ellos.
let index = csv.index(csv.startIndex, offsetBy: 21)
csv[index]
// "g"
print(index)
// prints Index(_rawBits: 1376513)
Sin embargo, ten en cuenta que si el desplazamiento no es un índice válido, es decir, si devuelve el índice anterior a startIndex o posterior a endIndex, la operación generará un error y hará que el programa se bloquee.
Para evitar este problema, puedes especificar un índice límite.
Esto devuelve un índice opcional y devolverá nil para los índices que de otro modo serían 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
Además, los índices no se pueden compartir entre strings.
Por ejemplo, usar el index de la «g» de «orange» calculado arriba para indexar el string fam = "This is my family: 👨👩👦👦, this is our dog: 🐶, this is our cat: 🐱!", es decir, fam[index], hará que tu programa se bloquee.
Hay muchas razones para todo esto, pero básicamente se reducen a que «Unicode es complicado».
En general, si necesitas acceso aleatorio a caracteres individuales, probablemente te convenga usar otra estructura de datos, como Array<Character>.
Swift tiene los métodos first y last para obtener el primer y el último carácter de un string.
Estos métodos devuelven un carácter opcional, así que si el string está vacío, devolverán nil.
let str = "Hello, world!"
print(str.first) // Prints Optional("H")
print(str.last) // Prints Optional("!")
También puedes usar los métodos prefix y suffix para obtener una subcadena de un string.
Estos métodos reciben un entero como argumento y devuelven una subcadena con los primeros o los últimos n caracteres del string.
let str = "Hello, world!"
print(str.prefix(5)) // Prints "Hello"
print(str.suffix(6)) // Prints "world!"
Trabajar con texto es una tarea común en programación. Swift, junto con el framework Foundation, ofrece muchos métodos y propiedades prácticos para inspeccionar, transformar y manipular strings.
components(separatedBy:)
Para dividir un string en un array de subcadenas según un delimitador, usa components(separatedBy:) (requiere importar Foundation):
import Foundation
let sentence = "Hello, world!"
let words = sentence.components(separatedBy: " ")
print(words) // Prints ["Hello,", "world!"]
hasPrefix(_:) y hasSuffix(_:)
Para comprobar si un string empieza o termina con una secuencia de caracteres específica, usa hasPrefix(_:) y hasSuffix(_:):
let greeting = "Hello, world!"
print(greeting.hasPrefix("Hello")) // Prints true
print(greeting.hasSuffix("world!")) // Prints true
Puedes transformar las mayúsculas y minúsculas de un string con estos métodos y propiedades estándar:
lowercased(): devuelve una copia del string en minúsculas.uppercased(): devuelve una copia del string en mayúsculas.capitalized: devuelve una copia en la que la primera letra de cada palabra está en mayúscula (de 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 reemplazar todas las apariciones de una subcadena objetivo por otro string, usa replacingOccurrences(of:with:) (de Foundation):
let greeting = "Hello, world!"
let updated = greeting.replacingOccurrences(of: "world", with: "Swift")
print(updated) // Prints "Hello, Swift!"
joined(separator:)
El método joined(separator:) pertenece a las colecciones de strings, como [String].
Une los elementos en un solo string usando un separador:
let words = ["Hello", "world"]
let sentence = words.joined(separator: ", ")
print(sentence) // Prints "Hello, world"
Se ha abierto un nuevo club de poesía en la ciudad y estás pensando en asistir. Como ha habido incidentes en el pasado, el club tiene una política de acceso muy específica que tendrás que dominar antes de intentar entrar.
En el club de poesía hay dos puertas y ambas están vigiladas. Para poder entrar, tendrás que averiguar la contraseña de ese día:
Lo primero que debes hacer es dividir el poema en líneas individuales. El guardia recitará un poema y tú tendrás que dividirlo en líneas.
Implementa la función splitOnNewlines que toma un string y lo divide en un array de strings, usando el carácter de salto de línea como delimitador.
La función debe devolver un array de strings, donde cada string es una línea del poema.
splitOnNewlines("Hello.\nHow are you?\n\nI'm doing fine.")
// returns ["Hello." ,"How are you?", "", "I'm doing fine"].
_ en su lugar.Por ejemplo, uno de sus escritores favoritos es Michael Lockwood, que escribió el siguiente poema acróstico, lo que significa que la primera letra de cada oración forma una palabra:
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
Cuando el guardia recite el poema, lo dividirás en líneas individuales y responderás con las primeras letras de cada línea, es decir, ["S", "H", "I", "R", "E"].
Luego, el guardia te dará la palabra formada por el array de letras con el que respondiste, para que la conviertas en una palabra con la primera letra en mayúscula.
Finalmente, la contraseña que devuelves es "SHIRE" y podrás entrar.
Implementa la función frontDoorPassword que toma un string que representa el poema.
La función debe devolver la contraseña que le darías al guardia.
frontDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "SHIRE"
En la parte trasera del club encontrarás a los poetas más famosos, algo así como el área VIP. Como esto no es para todos, el proceso de la puerta trasera es un poco más complicado.
", please" al final de la palabra formada por las letras.Por ejemplo, el poema mencionado antes también es telestiquio, lo que significa que la última letra de cada oración forma una palabra:
Stands so high
Huge hooves too
Impatiently waits for
Reins and harness
Eager to leave
Cuando el guardia recite el poema, lo dividirás en líneas individuales, quitarás cualquier espacio al final y responderás con las primeras letras de cada línea, es decir, ["h", "o", "r", "s", "e"].
Luego, el guardia te dará la palabra formada por el array de letras con el que respondiste, para que la conviertas en una palabra con la primera letra en mayúscula y agregues ", please".
Finalmente, la contraseña que devuelves es "horse, please" y podrás entrar.
Implementa la función backDoorPassword que toma un string que representa el poema.
La función debe devolver la contraseña que le darías al guardia.
backDoorPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nReins and harness\nEager to leave")
// returns "horse, please"
Dentro de la trastienda del club hay otra puerta que lleva a la sala secreta a la que solo pueden entrar los poetas más destacados.
"!" al final de la palabra formada por las letras.Por ejemplo, una versión modificada del poema mencionado antes sigue este patrón:
Stands so high
Huge hooves too
Impatiently waits for
Rider with harness
Eager to leave
Cuando el guardia recite el poema, lo dividirás en líneas individuales, quitarás cualquier espacio al final y responderás con las iésimas letras de cada línea, es decir, ["S", "u", "p", "e", "r"].
Luego, el guardia te dará la palabra formada por el array de letras con el que respondiste, para que la conviertas en una palabra en mayúsculas y agregues "!".
Finalmente, la contraseña que devuelves es SUPER! y podrás entrar.
Implementa la función secretRoomPassword que toma un string que representa el poema.
La función debe devolver la contraseña que le darías al guardia.
secretRoomPassword("Stands so high\nHuge hooves too\nImpatiently waits for\nRider with harness\nEager to leave")
// returns "SUPER!"
Regístrate en Exercism para aprender y dominar Swift con 35 conceptos116 ejercicios y mentoría humana real, todo gratis.