你如何访问Swift中的命令行参数?
如何在Swift中访问命令行应用程序的命令行参数?
使用顶级常量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
“数组”的第一个元素是应用程序的path。
C_ARGV
variables实际上不是一个数组,而是像数组一样是可以子脚本化的。
更新01/17/17:更新了Swift 3的示例。 Process
已被重命名为CommandLine
。
2015年9月30日更新:更新了Swift 2中的示例。
实际上可以在没有Foundation 或 C_ARGV
和C_ARGC
情况下执行此C_ARGC
。
Swift标准库包含一个struct CommandLine
,它具有一个名为arguments
的String
集合。 所以你可以打开这样的参数:
for argument in CommandLine.arguments { switch argument { case "arg1": print("first argument"); case "arg2": print("second argument"); default: print("an argument"); } }
在Swift 3中,使用CommandLine
枚举而不是Process
所以:
let arguments = CommandLine.arguments
任何想使用旧的“getopt”(可在Swift中使用)的人都可以使用它作为参考。 我在C中做了一个Swift的GNU例子的端口,可以在这里find:
http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
有完整的描述。 它经过testing,function齐全。 它也不需要基金会。
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)])!)'") }