DEV Community

David Goyes
David Goyes

Posted on • Edited on

Swift #5: Caracteres y Strings

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"
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. Usar la secuencia de escape \n.
  2. 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(): Retorna true si 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): Retorna true si comienza por el argumento.
  • hasSuffix(String): Retorna true si 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
Enter fullscreen mode Exit fullscreen mode

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 un Index?.
  • .lastIndex(of: Character): índice de la última ocurrencia del argumento. Como puede fallar, retorna un Index?.
  • .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 por upTo, 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
}
Enter fullscreen mode Exit fullscreen mode

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 índice Index, desplazado la cantidad de unidades dada por offsetBy, 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
}
Enter fullscreen mode Exit fullscreen mode

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!
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

En el siguiente ejemplo, se imprime un rango de índices:

var text = "Hola mundo"
if let spaceIndex = text.firstIndex(of: " ") {
  print(text[..<spaceIndex]) // Hola
}
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)