Как получить доступ к аргументам командной строки для приложения командной строки в Swift?
Как получить доступ к аргументам командной строки для приложения командной строки в Swift?
Ответы:
Apple выпустила ArgumentParser
библиотеку именно для этого:
Мы рады анонсировать
ArgumentParser
новую библиотеку с открытым исходным кодом, которая делает ее простой и даже приятной! - для анализа аргументов командной строки в Swift.
https://github.com/apple/swift-argument-parser
Начните с объявления типа, который определяет информацию, которую необходимо собрать из командной строки. Украсьте каждое сохраненное свойство одной из
ArgumentParser
оболочек свойств и объявите соответствиеParsableCommand
.
ArgumentParser
Библиотека разбирает аргументы командной строки, конкретизирует тип команды, а затем либо выполняет свой собственныйrun()
метод или выход с полезным сообщением.
Обновление 17.01.17: Обновленный пример для Swift 3. Process
был переименован в CommandLine
.
Обновление 30.09.2015: обновлен пример для работы в Swift 2.
На самом деле это возможно сделать без Foundation или C_ARGV
и 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), может использовать его как ссылку. Я сделал Swift-порт примера GNU на C, который можно найти по адресу:
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
массив и добавить любую логику, которая вам нравится.
Вы можете это проверить. Создать файл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
Проблема с созданием собственного анализатора аргументов заключается в учете всех соглашений об аргументах командной строки. Я бы рекомендовал использовать существующий парсер аргументов.
Вы можете использовать:
Я писал о том, как создавать инструменты командной строки для всех трех. Вы должны проверить их и решить, какой стиль вам больше подходит.
Если вам интересно, вот ссылки: