Tu primer script Swift increíble, Parte 1
Automatice sus aburridas tareas de localización con un práctico script de Swift .
Como ingeniero de iOS, a menudo me encuentro haciendo algunas tareas repetitivas y tediosas de vez en cuando, ¿quién no? Cuando pensaba en automatizar estas tareas, solía abordarlas desarrollando algunas utilidades y scripts de bash. Pero esa no fue la mejor experiencia para mí, ¡bash es súper poderoso pero algo obsoleto!
¿Por qué no desarrollar estos scripts usando el lenguaje que hablamos bastante bien? ¡¡Por suerte PODEMOS, y fácilmente!!
Así que aquí estoy abordando un problema tedioso para los ingenieros de iOS e intentaré desarrollar un script en Swift para resolverlo.
Planteamiento del problema
Administrar claves de localización en proyectos que admiten varios idiomas puede ser muy tedioso. El último proyecto en el que trabajé estaba localizado para 12 idiomas, por lo que puede imaginarse el esfuerzo de insertar, eliminar o eliminar una clave en este proyecto. Esta tarea simple fue una especie de tarea de un par de minutos.
Solución
Construiremos un script Swift que haga lo siguiente.
- Le pide el directorio del proyecto.
- Encuentra todos los archivos localizables en el directorio.
- Entonces le dirás ¿qué estás tratando de hacer? Agregue un nuevo par clave-valor, o modifique los valores para una clave en particular, o elimine los valores para una clave.
Arremanguémonos, abramos la terminal y escribamos lo siguiente..
$ mkdir Localize
$ cd Localize
$ swift package init --type executable
Para la reutilización, este script recibirá el directorio del proyecto en sus argumentos cuando se ejecuta para que pueda usarlo con muchos proyectos.
Primero obtengamos este directorio desde los argumentos de la línea de comandos.
enum Utils {
static var projectDirectory: String? {
CommandLine.arguments.count <= 1 ? nil : CommandLine.arguments[1]
}
}
Luego necesitaremos una función de utilidad para obtener los archivos localizables en el directorio al recorrer todos los archivos en el directorio raíz y filtrar los archivos con el sufijo Localizable.strings .
enum Utils {
static var localizableFiles: [String] {
guard
let rootDir = Utils.projectDirectory,
let files = FileManager.default.enumerator(atPath: rootDir)?.allObjects.compactMap({ $0 as? String })
else {
return []
}
return files.filter({$0.hasSuffix("/Localizable.strings") })
}
}
Finalmente, agregaremos dos funciones de utilidad para leer el contenido de un archivo en una URL y escribir en un archivo en una URL.
enum Utils {
static func contentOf(file relativeFilePath: String) -> FileContent {
guard let rootDir = projectDirectory else { return [] }
let filePath = "file:///\(rootDir)/\(relativeFilePath)"
guard
let url = URL(string: filePath),
let fileContent = try? String(contentsOf: url, encoding: .utf8)
else {
return []
}
return fileContent.trimmingCharacters(in: .newlines).components(separatedBy: "\n")
}
}
Y para escribir en un archivo, agregaremos esta función.
enum Utils {
static func write(content: String, to relativeFilePath: String) -> Bool {
guard let rootDir = projectDirectory else { return false }
let filePath = "file:///\(rootDir)/\(relativeFilePath)"
guard
let url = URL(string: filePath)
else {
return false
}
do {
try content.write(to: url, atomically: true, encoding: .utf8)
return true
} catch {
return false
}
}
}
Hasta ahora hemos desarrollado nuestro kit y podemos:
- Obtenga el directorio raíz de los argumentos.
- Extraiga los archivos localizables existentes en ese directorio.
- Leer el contenido de un archivo sabiendo su ruta.
- Escribir en un archivo en una ruta.

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































