Swift CLI 与 ArgumentParser:打造强大的控制台工具

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift(iOS/macOS)CLI 框架:ArgumentParser



在 Apple 生态系统开发中,经常需要创建不仅仅是图形界面应用,还有强大的控制台工具。无论是构建自动化、数据处理,还是为 iOS/macOS 创建辅助工具——都离不开高质量的 CLI(命令行界面)。为此,Apple 提供了官方框架 ArgumentParser,它是 Swift Package Manager 的一部分。这是一个现代、类型安全且声明式的工具,能够以最小的努力在 Swift 中创建控制台应用。



与通过 CommandLine.arguments 进行简单的参数解析不同,ArgumentParser 提供了一种结构化的方法:您将命令、标志和选项描述为结构体的属性,框架会自动生成帮助信息、处理错误并验证输入。让我们来了解如何在 macOS 和 iOS(通过 Swift Package Manager)中使用这个框架。



安装与集成



ArgumentParser 无需单独安装——它包含在 Swift 标准库中(从 Swift 5.5 开始)。要在您的项目中使用它,请在 Package.swift 中添加依赖:



// swift-tools-version:5.7import PackageDescription

let package = Package( name: "MyCLI", dependencies: [ .package(url: "https://github.com/apple/swift-argument-parser", from: "1.2.0") ], targets: [ .executableTarget( name: "MyCLI", dependencies: [ .product(name: "ArgumentParser", package: "swift-argument-parser") ] ) ])


对于 iOS 项目,可以通过 Xcode 中的 Swift Package Manager 添加该框架,指定相同的仓库地址。但需要注意的是,CLI 应用通常是为 macOS 创建的,不过该库也可用于 iOS 应用中进行内部字符串解析。



核心概念



ArgumentParser 围绕三个关键实体构建:



  • 命令(ParsableCommand)——基本元素,代表一条 CLI 命令。每条命令都是一个实现 ParsableCommand 协议的结构体。
  • 参数(@Argument)——位置参数,必须输入。
  • 选项(@Option)——命名参数,带有长(--name)和短(-n)标志。
  • 标志(@Flag)——布尔开关(--verbose, --quiet)。


示例:创建一个简单的 CLI 计算器



让我们创建一个 macOS 控制台应用,执行基本的算术运算:



import ArgumentParser

struct Calculator: ParsableCommand { static let configuration = CommandConfiguration( commandName: "calc", abstract: "一个简单的命令行计算器", discussion: "支持加法、减法、乘法和除法。" )

@Argument(help: "第一个数字") var firstNumber: Double

@Argument(help: "第二个数字") var secondNumber: Double

@Option(name: [.short, .long], help: "操作:add, sub, mul, div") var operation: String = "add"

@Flag(name: [.short, .long], help: "详细输出") var verbose: Bool = false

mutating func run() throws { let result: Double switch operation { case "add": result = firstNumber + secondNumber case "sub": result = firstNumber - secondNumber case "mul": result = firstNumber * secondNumber case "div": guard secondNumber != 0 else { throw ValidationError("除以零!") } result = firstNumber / s

推荐