UITextChecker
Un teclado diminuto dibujado sobre un trozo de cristal no siempre permite una escritura perfecta. Y ya sea porque te corrige con destreza o con algún divertido sinsentido, cualquiera que escriba en un dispositivo iOS se da cuenta rápidamente cuando entra en acción el autocorrector. Quizá no sepas que UIKit cuenta con una clase para asistir la escritura de los usuarios dentro de tu app.
Introducido en iOS 3.2 (¿o deberíamos llamarlo iPhone OS 3.2, dada la fecha?), UIText
hace lo que su propio nombre indica: comprueba texto. Sigue leyendo para aprender cómo usar esta clase para comprobación de ortografía y completado de palabras.
Comprobación de ortografía
¿Qué ocurre si escribes mal una palabra en iOS? Si escribes «hipstar» en un campo de texto, iOS te sugerirá corregirlo a «hipster» la mayoría de las veces.
Podemos conseguir la misma sugerencia usando UIText
:
import UIKit
let str = "hipstar"
let text Checker = UIText Checker()
let misspelled Range = text Checker.range Of Misspelled Word(in: str,
range: NSRange(0..<str.utf16.count),
starting At: 0,
wrap: false,
language: "en_US")
if misspelled Range.location != NSNot Found,
let first Guess = text Checker.guesses(for Word Range: misspelled Range,
in: str,
language: "en_US")?.first
{
print("First guess: \(first Guess)") // First guess: hipster
} else {
print("Not found")
}
NSString *str = @"hipstar";
UIText Checker *text Checker = [[UIText Checker alloc] init];
NSRange misspelled Range = [text Checker
range Of Misspelled Word In String:str
range:NSMake Range(0, [str length])
starting At:0
wrap:NO
language:@"en_US"];
NSArray *guesses = [NSArray array];
if (misspelled Range.location != NSNot Found) {
guesses = [text Checker guesses For Word Range:misspelled Range
in String:str
language:@"en_US"];
NSLog(@"First guess: %@", [guesses first Object]);
// First guess: hipster
} else {
NSLog(@"Not found");
}
El array de ristras devuelvo podría parecerse a este:
["hipster", "hip star", "hip-star", "hips tar", "hips-tar"]
O quizá no, ya que UIText
sugiere en base al contexto y al dispositivo. De acuerdo a la documentación, guesses(for
devuelve un array de ristras en el orden en el que deberían mostrarse, representando sugerencias de palabras que podrían aplicarse en lugar de la palabra mal escrita presente en el rango y ristra dados.
Por lo tanto, no se asegura idempotencia o corrección, lo cual tiene sentido para un método que cuenta con guesses
en su propio nombre. ¿Cómo podrían fiarse los NSHipsters de su valor de retorno? Encontraremos la respuesta si escarbamos un poco más.
Aprendiendo palabras nuevas
Asumamos que quieres que tus usuarios puedan escribir «hipstar»
exactamente. Puedes decirle a tu app que aprenda la palabra usando el método de clase UIText
:
UIText Checker.learn Word(str)
[UIText Checker learn Word:str];
Así que «hipstar»
es ahora una palabra reconocida para el dispositivo entero y no aparecerá como incorrecta en futuras comprobaciones.
let misspelled Range = text Checker.range Of Misspelled Word(in: str,
range: NSRange(0..<str.utf16.count),
starting At: 0, wrap: false, language: "en_US")
misspelled Range.location == NSNot Found // true
NSRange misspelled Range = [text Checker
range Of Misspelled Word In String:str
range:NSMake Range(0, [str length])
starting At:0
wrap:NO
language:@"en_US"];
misspelled Range.location == NSNot Found // YES
La búsqueda del ejemplo superior devuelve NSNot
porque UIText
aprendió la palabra que habíamos creado. UIText
también cuenta con métodos de clase para comprobar y olvidar palabras: UIText
y UIText
, respectivamente..
Sugerencias de completado
Existe una API de UIText
para encontrar posibles completados dada una palabra parcial:
let partial = "hipst"
let completions = text Checker.completions(for Partial Word Range: NSRange(0..<partial.utf16.count),
in: partial,
language: "en_US")
completions == ["hipster", "hipsters", "hipster's"] // true
NSString *partial = @"hipst";
NSArray *completions = [text Checker
completions For Partial Word Range:NSMake Range(0, [partial length])
in String:partial
language:@"en_US"];
completions == ["hipster", "hipsters", "hipster's"] // YES
completions(for
devuelve un array de posibles palabras dada una ristra parcial inicial. Aunque la documentación dice que el array de ristras devuelto está ordenado por probabilidad, en realidad está ordenado alfabéticamente. La versión hermana de UIText
en macOS, llamada NSSpell
, sí se comporta como describe la documentación.
No verás ninguna de las palabras personalizadas que le enseñes a
UIText
aparecer como sugerencias de completado. Esto es así porque el vocabulario añadido víaChecker UIText
es global al dispositivo y así se evita que las palabras aprendidas en tu app aparezcan en las autocorrecciones de otra.Checker.learn Word(_:)
Si estás construyendo una app con una gran carga textual, usa UIText
para asegurarte de que el sistema no corrija tu propio vocabulario. Si estás escribiendo una extensión para el teclado, usa UIText
y UILexicon
para proporcionar palabras del diccionario del sistema y los nombres y apellidos de los usuarios de la libreta de direcciones. ¡Puedes soportar prácticamente cualquier idioma sin necesidad de crear tus propios diccionarios!