Character
Un caracter viene dado por un número binario, que representa el índice de un elemento en la tabla "Unicode" que define los caracteres del sistema.
let letra: Character = "A"
Se puede desplegar la biblioteca de emojis con el short-cut Control+Command+Space.
String
Un String es una secuencia de datos de tipo Character. Un String puede ser reemplazado por otro de longitud diferente, concatenar otro String con el operador +, o modificar una parte de este.
let palabra: String = "Hola"
let oracion = "Hola " + "mundo"
Interpolación
Para concatenar un String con un valor de otro tipo, se puede usar interpolación.
let manos = 2
let mensaje = "Tengo \(manos) manos" // Tengo 2 manos
Secuencias de escape
Algunos caracteres son usados en la construcción de un String (") o en la interpolación de un valor (\). Por esta razón, si se quiere usar estos caracteres como parte del mensaje (junto con otros caracteres más), se debe usar una secuencia de escape como las siguientes:
-
\\: Barra invertida literal \ -
\": Comilla doble literal " -
\t: Tabulación (tab) -
\n: Nueva línea (line feed) -
\r: Retorno de carro (carriage return) -
\0: Caracter nulo (null character) -
\u{...}: Caracter Unicode arbitrario.
String crudo (Raw string)
Un raw string (cadena “cruda”) es una forma de escribir Strings sin necesidad de escapar los caracteres especiales como \ o ". Esta es su sintaxis: #"texto literal"#, donde las comillas más externas están envueltas entre signos #.
- Si quiero usar un
#dentro del String, debo envolver las comillas con##(e.g.##"...#..."##). - Si quiero una secuencia de escape dentro del Raw String debo usar
\#en lugar de\. (e.g.#"Línea nueva: \#n"#produce un salto de línea). - Para interpolar valores debo usar tantos
#como haya puesto al inicio/fin del String: (e.g.##"Hola \##(nombre)"##).
String multilínea
Tenemos dos opciones:
- Usar la secuencia de escape
\n. - Envolver el String con tres comillas dobles:
""".
String como estructura
El tipo de dato String, así como todos los tipos de datos primitivos de Swift, es una estructura. Por esta razón, trae valor métodos útiles como los siguientes:
-
isEmpty(): Retornatruesi es"" -
count: Propiedad que retorna el número de caracteres -
first: Retorna el primer caracter del string. -
last: Retorna el último caracter del string. -
lowercased(): Retorna una copia en minúsculas. -
uppercased(): Retorna una copia en mayúsculas. -
hasPrefix(String): Retornatruesi comienza por el argumento. -
hasSuffix(String): Retornatruesi termina con el argumento.
Se puede usar el inicializador de la estructura para convertir valores de otros tipos a String. Por ejemplo:
let total = String("5")
let result = "Result was: \(total)" // Result was 5
Indexación del String
Como los caracteres están en formato Unicode, pueden tener distintas dimensiones (i.e. UTF-8, UTF-16 o UTF-32). Por esta razón, no se puede establecer la posición de un caracter con un número entero. El índice del primer caracter es 0, pero los índices de los siguientes caracteres dependen del tamaño de sus predecesores. Para resolver este problema, se usa la estructura String.Index para manejar los índices, que tienen las siguientes propiedades y métodos.
-
startIndex: Apunta a la posición del primer caracter. -
endIndex: Apunta a la posición DESPUÉS del último caracter. -
.firstIndex(of: Character): índice de la primera ocurrencia del caracter pasado por argumento. Como puede fallar, retorna unIndex?. -
.lastIndex(of: Character): índice de la última ocurrencia del argumento. Como puede fallar, retorna unIndex?. .insert(Character, at: Index).insert(contentsOf: String, at: Index).remove(at: Index)-
.prefix(Int): Crea un string desde el primer caracter de la cadena original, con la longitud determinada por el argumento. -
.prefix(through: Index): Crea un string desde el primer caracter de la cadena original, hasta el índice dado por el argumento. -
.prefix(upTo: Index): Crea un string desde el primer caracter hasta el ´ˆndice indicado porupTo, sin incluir este último caracter. -
.replaceSubrange(Range, with: String): Reemplaza los caracteres en la posición determinada por el rango del primer argumento, con el String del segundo argumento. -
removeSubrange(Range): Elimina los caracteres en las posiciones determinadas por el rango del argumento.
Para acceder a un caracter específico de un String, se debe declarar la estructura Index con el índice del caracter que se quiere acceder y, luego, usar el operador "subscript" (i.e. []) sobre el string.
let text = "David"
if !text.isEmpty() {
let start = text.startIndex
let firstCharacter = text[start]
print("El primer caracter es \(firstCharacter)") // El primer caracter es D
}
Para hallar un caracter específico, debemos hacerlo de forma relativa con los siguientes métodos:
-
.index(after: Index): Retorna el índice después del argumento. -
.index(before: Index): Retorna el índice antes del argumento. -
.index(Index, offsetBy: Int): Retorna un nuevo índice, con base en el índiceIndex, desplazado la cantidad de unidades dada poroffsetBy, que puede ser positiva o negativa.
let text = "David"
if !text.isEmpty() {
let start = text.startIndex
let anotherIndex = text.index(start, offsetBy: 3)
let anotherCharacter = text[anotherIndex]
print("El otro caracter es \(anotherCharacter)") // El otro caracter es 4
}
En el siguiente ejemplo, se inserta un signo de exclamación después del último caracter usando .insert(_,at:) y endIndex, teniendo en cuenta que endIndex apunta a la posición después del último caracter.
var text = "David"
text.insert("!", at: text.endIndex)
print(text) // David!
En el siguiente ejemplo, se elimina el caracter "v" de la palabra inicial.
var text = "David"
if let vCharIndex = text.firstIndex(of: "v") {
text.remove(at: vCharIndex)
}
print(text) // Daid
En el siguiente ejemplo, se imprime un rango de índices:
var text = "Hola mundo"
if let spaceIndex = text.firstIndex(of: " ") {
print(text[..<spaceIndex]) // Hola
}
En el siguiente ejemplo, se elimina la primera palabra:
var text = "Hola mundo"
if let spaceIndex = text.firstIndex(of: " ") {
text.replaceSubrange(...spaceIndex, with: "")
// text.removeSubrange(...spaceIndex)
print(text) // mundo
}
Top comments (0)