Jak uzyskać dostęp do argumentów wiersza poleceń dla aplikacji wiersza poleceń w Swift?
Jak uzyskać dostęp do argumentów wiersza poleceń dla aplikacji wiersza poleceń w Swift?
Odpowiedzi:
Firma Apple udostępniła ArgumentParser
bibliotekę właśnie w tym celu:
Z przyjemnością ogłaszamy
ArgumentParser
, że nowa biblioteka open-source jest prosta - a nawet przyjemna! - analizować argumenty wiersza poleceń w języku Swift.
https://github.com/apple/swift-argument-parser
Rozpocznij od zadeklarowania typu, który definiuje informacje, które musisz zebrać z wiersza poleceń. Udekoruj każdą przechowywaną właściwość jednym z
ArgumentParser
opakowań właściwości i zadeklaruj zgodność zParsableCommand
.
ArgumentParser
Biblioteka analizuje argumenty wiersza polecenia, instancję typ polecenia, a następnie albo wykonuje niestandardowąrun()
metodę lub wychodzi z przydatnych wiadomości.
Aktualizacja 17.01.2017: Zaktualizowano nazwę przykładu Swift 3. Process
na CommandLine
.
Aktualizacja 30.09.2015: Zaktualizowano przykład, aby działał w Swift 2.
W rzeczywistości można to zrobić bez Foundation lub C_ARGV
i C_ARGC
.
Biblioteka standardowa Swift zawiera strukturę, CommandLine
która ma kolekcję String
plików nazwanych arguments
. Możesz więc włączyć takie argumenty:
for argument in CommandLine.arguments {
switch argument {
case "arg1":
print("first argument")
case "arg2":
print("second argument")
default:
print("an argument")
}
}
Process.arguments
taki sam jak NSProcessInfo.processInfo().arguments
?
Process
obiekt jest teraz znany jako CommandLine
obiekt. Prawdopodobnie zostanie to w pełni włączone po oficjalnym wydaniu Swift 3.0.
Użyj stałych najwyższego poziomu C_ARGC
i 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")
}
}
Zauważ, że używam zakresu od, 1..C_ARGC
ponieważ pierwszym elementem C_ARGV
„tablicy” jest ścieżka aplikacji.
C_ARGV
Zmiennej rzeczywistości nie jest tablicą, ale jest sub-skrypty jak tablicy.
C_ARCG
wydaje się, że nie jest już obsługiwany.
Process.argc
i Process.arguments
do tego, chociaż wygląda na to, że może się to zmienić na CommandLine.argc
i CommandLine.arguments
wraz z ostatnimi zmianami języka.
Każdy, kto chce używać starego „getopt” (dostępnego w Swift), może użyć tego jako odniesienia. Zrobiłem port Swift przykładu GNU w C, który można znaleźć pod adresem:
http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
z pełnym opisem. Jest przetestowany iw pełni funkcjonalny. Nie wymaga też Fundacji.
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)])!)'")
}
Możesz utworzyć parser argumentów za pomocą CommandLine.arguments
Array i dodać dowolną logikę.
Możesz to przetestować. Utwórz plikarguments.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)
}
skompiluj i uruchom:
$ swiftc arguments.swift
$ ./arguments argument1 argument2 argument3
Problem z budowaniem własnego parsera argumentów polega na uwzględnieniu wszystkich konwencji argumentów wiersza poleceń. Poleciłbym użycie istniejącego parsera argumentów.
Możesz użyć:
Pisałem o tym, jak budować narzędzia wiersza poleceń na wszystkich trzech. Powinieneś je sprawdzić i zdecydować, jaki styl najbardziej Ci odpowiada.
Jeśli jesteś zainteresowany, oto linki: