Framework CLI para Swift: creación de utilidades de consola en iOS y macOS
El desarrollo de aplicaciones de consola (CLI — Command Line Interface) para el ecosistema de Apple durante mucho tiempo fue prerrogativa de Python, Ruby o Bash. Sin embargo, con la aparición de Swift y su potente conjunto de herramientas, incluyendo Swift Package Manager (SPM), surgió la posibilidad de crear utilidades de consola rápidas, tipificadas y fácilmente mantenibles en el lenguaje nativo de iOS/macOS. En este artículo, analizaremos en detalle el framework principal para construir CLI en Swift — Apple's ArgumentParser, así como soluciones alternativas.
¿Qué es un framework CLI para Swift?
Un framework CLI es una biblioteca que se encarga de las tareas rutinarias de analizar argumentos de línea de comandos, generar ayuda, manejar errores y organizar comandos. En el mundo de Swift, el estándar de facto es ArgumentParser, desarrollado por Apple y que forma parte de Swift Open Source. Permite describir de forma declarativa la interfaz de su utilidad, y todo lo demás lo hace automáticamente.
Principales capacidades de ArgumentParser:
- Definición declarativa de comandos — usted describe la estructura y el framework analiza los argumentos por sí mismo.
- Ayuda automática — las banderas
--helpy-hse generan automáticamente. - Soporte para comandos anidados (como en
gitoswift). - Validación de tipos — si se espera un número y se pasa una cadena, se mostrará un error claro.
- Integración con SPM — basta con agregar la dependencia en
Package.swift.
Instalación y configuración
Para trabajar necesitará Swift 5.5+ (se recomienda 5.7 o superior). Cree un nuevo proyecto de consola a través de SPM:
mkdir MyCLIcd MyCLIswift package init --type executableLuego edite Package.swift, agregando la dependencia de ArgumentParser:
// swift-tools-version:5.7import PackageDescription
let package = Package( name: "MyCLI", dependencies: [ .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.2.0") ], targets: [ .executableTarget( name: "MyCLI", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser") ] ) ])Ahora actualice las dependencias y abra el proyecto:
swift package updateopen Package.swift # abrirá en XcodeCreación del primer comando
Cree un archivo main.swift (o Sources/MyCLI/main.swift) con el siguiente contenido:
import ArgumentParser
struct Greet: ParsableCommand { static let configuration = CommandConfiguration( abstract: "Saludo al usuario", discussion: "Este comando muestra un saludo personalizado." )
@Argument(help: "Nombre del usuario") var name: String
@Option(name: .shortAndLong, help: "Número de repeticiones") var count: Int = 1
@Flag(name: .shortAndLong, help: "Mostrar versión") var verbose: Bool = false
mutating func run() throws { if verbose { print("Versión 1.0.0") } for _ in 0..<count { print("¡Hola, \\(name)!\") } }}
Greet.main()Ahora compile y ejecute:
swift run MyCLI Swift --count 3# Salida:# ¡Hola, Swift!# ¡Hola, Swift!# ¡Hola, Swift!
swift run MyCLI --help# Usage: MyCLI <name> [--count <count>] [--verbose]# Saludo al usuario# ...Comandos anidados (subcomandos)
Para crear utilidades complejas (como
También en la biblioteca
zerolog para Go: guía completa con ejemplos prácticos
Programación Reactiva en C++: bibliotecas RxCpp y Boost.Signals2
Okio para Kotlin: guía completa con ejemplos prácticos
Multer para JavaScript (Node.js): guía completa con ejemplos
Validación de datos en C++: bibliotecas, patrones y ejemplos de código