143 votes

Comment accéder aux arguments de la ligne de commande en Swift ?

Comment accéder aux arguments de ligne de commande pour une application en ligne de commande en Swift ?

2 votes

323voto

Mark Adams Points 17189

Mise à jour 01/17/17 : Mise à jour de l'exemple pour Swift 3. Process a été renommé en CommandLine .


Mise à jour 09/30/2015 : Mise à jour de l'exemple pour fonctionner en Swift 2.


Il est possible de le faire sans la Fondation. ou C_ARGV y C_ARGC .

La bibliothèque standard de Swift contient une structure CommandLine qui dispose d'une collection de String s appelé arguments . Vous pourriez donc passer à 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")
    }
}

0 votes

Si vous voulez un tableau, cette construction est très pratique. let args = [String](Process.arguments)

11 votes

@AlbinStigo Process.arguments est déjà un tableau de chaînes de caractères, pas besoin d'en créer un nouveau.

10 votes

Comme presque toujours, la meilleure réponse n'est pas celle qui est acceptée :)

65voto

Maciek Czarnik Points 445

En Swift 3, utilisez CommandLine au lieu de Process

Donc :

let arguments = CommandLine.arguments

47voto

orj Points 4480

Utiliser les constantes de premier niveau C_ARGC y 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 l'intervalle de 1..C_ARGC car le premier élément du C_ARGV "array" est le chemin de l'application.

El C_ARGV n'est pas réellement un tableau mais elle peut être sous-scrite comme un tableau.

4 votes

Vous pouvez également utiliser NSProcessInfo, comme vous le faites en Objective-C.

3 votes

NSProcessInfo nécessite Foundation. Ma réponse ne nécessite pas Foundation. Elle utilise simplement la librairie standard de Swift Lang.

7 votes

C_ARCG semble ne plus être supporté.

15voto

pkamb Points 918

Apple a publié le ArgumentParser bibliothèque pour faire cela :

Nous avons le plaisir d'annoncer ArgumentParser Swift, une nouvelle bibliothèque open-source qui rend simple - et même agréable ! - d'analyser les arguments de la ligne de commande en Swift.

https://swift.org/blog/argument-parser/


Analyseur d'arguments 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 éléments suivants ArgumentParser et déclarent leur conformité à la norme ParsableCommand .

El ArgumentParser analyse les arguments de la ligne de commande, instancie votre type de commande, puis exécute votre commande personnalisée. run() ou se termine par un message utile.

14voto

Tous ceux qui veulent utiliser l'ancien "getopt" (qui est disponible en Swift) peuvent l'utiliser comme référence. J'ai fait un portage en Swift de l'exemple GNU en C que l'on peut trouver à l'adresse suivante :

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. Il 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)])!)'")
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X