Answers:
苹果已经发布了ArgumentParser
用于执行此操作的库:
我们很高兴地宣布
ArgumentParser
,这是一个新的开源库,使它变得简单明了-甚至令人愉快!—在Swift中解析命令行参数。
https://github.com/apple/swift-argument-parser
首先声明一个类型,该类型定义您需要从命令行收集的信息。使用
ArgumentParser
的属性包装器装饰每个存储的属性,并声明与的一致性ParsableCommand
。该
ArgumentParser
库解析命令行参数,实例化您的命令类型,然后执行您的自定义run()
方法或退出并显示一条有用的消息。
更新01/17/17:更新了Swift 3的示例,Process
已重命名为CommandLine
。
2015年9月30日更新:更新了示例,使其可在Swift 2中使用。
实际上,没有Foundation 或 C_ARGV
and 也可以这样做C_ARGC
。
Swift标准库包含一个结构CommandLine
,该结构具有的集合,String
称为arguments
。因此,您可以打开这样的参数:
for argument in CommandLine.arguments {
switch argument {
case "arg1":
print("first argument")
case "arg2":
print("second argument")
default:
print("an argument")
}
}
Process.arguments
一样的NSProcessInfo.processInfo().arguments
吗?
Process
对象现在称为CommandLine
对象。Swift 3.0正式发布后,这可能会完全合并。
使用顶级常量C_ARGC
和C_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
变量实际上不是数组,但是可以像数组一样被子脚本化。
C_ARCG
似乎不再受支持。
Process.argc
和Process.arguments
为此,尽管看起来这可能正在更改为该语言,CommandLine.argc
并且CommandLine.arguments
最近更改了该语言。
任何想要使用旧的“ 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)])!)'")
}
您可以使用CommandLine.arguments
Array 创建参数解析器,然后添加所需的任何逻辑。
你可以测试一下。建立档案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
建立自己的参数解析器的问题是考虑了所有命令行参数约定。我建议使用现有的参数解析器。
您可以使用:
我已经写过关于如何在这三个平台上构建命令行工具的文章。您应该检查一下它们,然后确定哪种样式最适合您。
如果您对此感兴趣,请访问以下链接: