Comment accéder aux arguments de ligne de commande pour une application de ligne de commande dans Swift?
Comment accéder aux arguments de ligne de commande pour une application de ligne de commande dans Swift?
Réponses:
Apple a publié la ArgumentParser
bibliothèque pour faire exactement cela:
Nous sommes ravis d'annoncer
ArgumentParser
, une nouvelle bibliothèque open-source qui la rend simple - même agréable! - pour analyser les arguments de ligne de commande dans Swift.
https://github.com/apple/swift-argument-parser
Commencez par déclarer un type qui définit les informations que vous devez collecter à partir de la ligne de commande. Décorez chaque propriété stockée avec l'un des
ArgumentParser
wrappers de propriété de et déclarez la conformité àParsableCommand
.La
ArgumentParser
bibliothèque analyse les arguments de ligne de commande, instancie votre type de commande, puis exécute votrerun()
méthode personnalisée ou quitte avec un message utile.
Mise à jour 17/01/17: mise à jour de l'exemple pour Swift 3. Process
a été renommé en CommandLine
.
Mise à jour 30/09/2015: mise à jour de l'exemple pour qu'il fonctionne dans Swift 2.
Il est en fait possible de faire cela sans Foundation ou C_ARGV
et C_ARGC
.
La bibliothèque standard Swift contient une structure CommandLine
qui a une collection de String
s appelée arguments
. Vous pouvez donc activer des arguments comme celui-ci:
for argument in CommandLine.arguments {
switch argument {
case "arg1":
print("first argument")
case "arg2":
print("second argument")
default:
print("an argument")
}
}
Process.arguments
le même que NSProcessInfo.processInfo().arguments
?
Process
objet est maintenant connu sous le nom d' CommandLine
objet. Cela sera probablement entièrement intégré une fois que Swift 3.0 sera officiellement publié.
Dans Swift 3, utilisez CommandLine
enum au lieu deProcess
Alors:
let arguments = CommandLine.arguments
Utilisez les constantes de niveau supérieur C_ARGC
et 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")
}
}
Notez que j'utilise la plage de 1..C_ARGC
car le premier élément du C_ARGV
"tableau" est le chemin de l'application.
La C_ARGV
variable n'est pas réellement un tableau mais est sous-scriptable comme un tableau.
C_ARCG
semble ne plus être pris en charge.
Process.argc
et Process.arguments
pour cela, bien qu'il semble que cela puisse changer pour CommandLine.argc
et CommandLine.arguments
avec les modifications les plus récentes de la langue.
Quiconque souhaite utiliser l'ancien "getopt" (qui est disponible dans Swift) peut l'utiliser comme référence. J'ai fait un portage Swift de l'exemple GNU en C que l'on peut trouver sur:
http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
avec une description complète. Il est testé et entièrement fonctionnel. Cela ne nécessite pas non plus de Fondation.
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)])!)'")
}
Vous pouvez créer un analyseur d'arguments à l'aide du CommandLine.arguments
tableau et ajouter la logique de votre choix.
Vous pouvez le tester. Créer un fichierarguments.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)
}
compilez-le et exécutez-le:
$ swiftc arguments.swift
$ ./arguments argument1 argument2 argument3
Le problème avec la construction de votre propre analyseur d'arguments est de prendre en compte toutes les conventions d'argument de ligne de commande. Je recommanderais d'utiliser un analyseur d'arguments existant.
Vous pouvez utiliser:
J'ai écrit sur la façon de créer des outils de ligne de commande sur les trois. Vous devriez les vérifier et décider quel style vous convient le mieux.
Si vous êtes intéressé, voici les liens: