Як ви отримуєте доступ до аргументів командного рядка для програми командного рядка в 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.
Насправді це можливо зробити без фонду чи C_ARGV
та C_ARGC
.
Стандартна бібліотека Swift містить структуру, CommandLine
яка має колекцію String
s 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
з повним описом. Це перевірено і повністю функціональне. Він також не потребує фонду.
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
Проблема зі створенням власного аналізатора аргументів враховує всі умовності аргументів командного рядка. Я рекомендую використовувати існуючий аналізатор аргументів.
Ви можете використовувати:
Я писав про те, як створити інструменти командного рядка на всіх трьох. Ви повинні перевірити їх і вирішити, який стиль вам найбільше підходить.
Якщо ви зацікавлені тут, перейдіть за посиланнями: