web-dev-qa-db-fra.com

Comment accéder aux arguments de ligne de commande dans Swift?

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

108
Anthony Mittaz

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 parce que le premier élément de la C_ARGV "tableau" est le chemin de l'application.

Le C_ARGV La variable _ n'est pas réellement un tableau mais est sous-scriptable comme un tableau.

44
orj

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


Mise à jour du 30/09/2015: == Mise à jour de l’exemple pour fonctionner dans Swift 2.


En fait, il est possible de le faire sans Foundation ou C_ARGV et C_ARGC.

La bibliothèque standard Swift contient une structure CommandLine qui contient une collection de Strings appelée arguments. Vous pouvez donc activer des arguments tels que:

for argument in CommandLine.arguments {
    switch argument {
    case "arg1":
        print("first argument")

    case "arg2":
        print("second argument")

    default:
        print("an argument")
    }
}
290
Mark Adams

Dans Swift 3 utilisez CommandLine enum au lieu de Process

Alors:

let arguments = CommandLine.arguments
54
Maciek Czarnik

Toute personne souhaitant utiliser l'ancien "getopt" (disponible dans Swift) peut l'utiliser comme référence. J'ai fait un Swift port du GNU en C on peut le trouver à l’adresse suivante:

http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html

avec une description complète. C'est testé et entièrement fonctionnel. Il ne nécessite pas de fondation non plus.

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)])!)'")
}
12
Michele Dall'Agata