如何在 Swift 中访问命令行参数?

如何在 Swift 中访问命令行应用程序的命令行参数?

53573 次浏览

使用顶级常量 C_ARGCC_ARGV

for i in 1..C_ARGC {
let index = Int(i);


let arg = String.fromCString(C_ARGV[index])
switch arg {
case "this":
println("this yo");


case "that":
println("that yo")


default:
println("dunno bro")
}
}

注意,我使用的是 1..C_ARGC的范围,因为 C_ARGV“数组”的第一个元素是应用程序的路径。

C_ARGV变量实际上不是一个数组,而是像数组一样可以下脚本的。

更新01/17/17: 更新 Swift 3的示例。


更新09/30/2015: 更新了在 Swift 2中工作的示例。


实际上,没有基础 或者C_ARGC也可以做到这一点。

Swift 标准库包含一个结构 CommandLine,它有一个称为 argumentsString集合。所以你可以像这样切换参数:

for argument in CommandLine.arguments {
switch argument {
case "arg1":
print("first argument")


case "arg2":
print("second argument")


default:
print("an argument")
}
}

任何想使用旧的“ getopt”(在 Swift 中可用)的人都可以使用它作为参考。我用 C 语言做了一个 GNU 的 Swift 端口,你可以在下面找到:

Http://www.gnu.org/software/libc/manual/html_node/example-of-getopt.html

它经过测试,功能齐全,也不需要 Foundation。

var aFlag   = 0
var bFlag   = 0
var cValue  = String()


let pattern = "abc:"
var buffer = Array(pattern.utf8).map { Int8($0) }


while  true {
let option = Int(getopt(C_ARGC, C_ARGV, buffer))
if option == -1 {
break
}
switch "\(UnicodeScalar(option))"
{
case "a":
aFlag = 1
println("Option -a")
case "b":
bFlag = 1
println("Option -b")
case "c":
cValue = String.fromCString(optarg)!
println("Option -c \(cValue)")
case "?":
let charOption = "\(UnicodeScalar(Int(optopt)))"
if charOption == "c" {
println("Option '\(charOption)' requires an argument.")
} else {
println("Unknown option '\(charOption)'.")
}
exit(1)
default:
abort()
}
}
println("aflag ='\(aFlag)', bflag = '\(bFlag)' cvalue = '\(cValue)'")


for index in optind..<C_ARGC {
println("Non-option argument '\(String.fromCString(C_ARGV[Int(index)])!)'")
}

在 Swift 3中使用 CommandLine枚举代替 Process

所以:

let arguments = CommandLine.arguments

苹果发布了 ArgumentParser库,就是为了做到这一点:

我们很高兴地宣布 ArgumentParser,一个新的开源库,使它变得简单-甚至令人愉快!ー解析 Swift 中的命令行参数。

Https://swift.org/blog/argument-parser/


快速参数解析器

Https://github.com/apple/swift-argument-parser

首先声明一个类型,该类型定义需要从命令行收集的信息。用 ArgumentParser的一个属性包装器装饰每个存储属性,并声明与 ParsableCommand一致。

ArgumentParser库解析命令行参数,实例化命令类型,然后执行自定义的 run()方法,或者使用有用的消息退出。

您可以使用 CommandLine.arguments数组创建一个参数解析器,并添加任何您喜欢的逻辑。

您可以测试它。创建一个文件 arguments.swift

//Remember the first argument is the name of the executable
print("you passed \(CommandLine.arguments.count - 1) argument(s)")
print("And they are")
for argument in CommandLine.arguments {
print(argument)
}

编译并运行它:

$ swiftc arguments.swift
$ ./arguments argument1 argument2 argument3

构建自己的参数解析器的问题在于要考虑所有命令行参数约定。我建议使用现有的参数解析器。

你可以用:

  • 蒸汽控制台模块
  • Swift 软件包管理器使用的 TSCUtilityArguentParser
  • 苹果公司开源的 Swift Argument 解析器

我曾经写过如何在这三个工具上构建命令行工具。你应该去看看,然后决定什么样的风格最适合你。

如果你有兴趣,这里的链接: