web-dev-qa-db-fra.com

Comment accéder aux arguments du programme dans Swift?

C et les dérivés ont des paramètres argc et argv (et envp) pour leurs fonctions de point d'entrée, mais Swift n'en a pas de propre) : le code de niveau supérieur est juste du code et n'a pas de paramètres.

Comment accéder à l'équivalent de argc et argv dans un programme Swift?

36
zneak

Le processus vient d'être renommé en CommandLine (puisque Swift 3.0 Instantané du 4 août)

let arguments = CommandLine.arguments

(pour une raison quelconque, cela n'a pas été mentionné sur le changelog )

45
ambientlight

Process.arguments est votre ami!

Heureusement, c'est beaucoup plus facile et intégré: pas d'importation de quoi que ce soit, pas de se salir les mains avec C, objectif ou autre.

Considérez cela, appelons-le args.Swift:

Swift 2 version:

var c = 0;
for arg in Process.arguments {
    println("argument \(c) is: \(arg)")
    c++
}

Swift version:

var c = 0;
for arg in CommandLine.arguments {
    print("argument \(c) is: \(arg)")
    c += 1
}

Nous pouvons le compiler et l'exécuter comme ceci:

$ Swift -o args args.Swift && ./args fee fi fo fum
argument 0 is: ./args
argument 1 is: fee
argument 2 is: fi
argument 3 is: fo
argument 4 is: fum

Notez que le premier argument est le nom du programme, comme vous pouvez vous y attendre.

Il semble que chaque argument soit une chaîne, comme vous pouvez également vous y attendre.

J'espère beaucoup que Process deviendra plus utile à mesure que Swift mûrit, mais en ce moment il semble ne vous donner que les arguments. Ce qui est beaucoup, si vous essayez de écrire un programme pur-Swift.

38
Kevin Frost

Dès que votre application est en place, j'utilise les informations sur le processus:

let args = NSProcessInfo.processInfo().arguments
print(args)

Rien de dangereux là-bas, très pratique.

Notez que vous devez import Foundation (ou Cocoa/UIKit).

12
Daij-Djan

Pour Swift vous pouvez utiliser ce code:

let argc = CommandLine.argc
let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc))

qui est équivalent aux paramètres argc et argv utilisés dans la fonction principale d'Objective-C:

int main(int argc, char *argv[])

Pour les anciennes versions de Swift, vous pouvez utiliser Process.argc et Process.unsafeArgv ou C_ARGC et C_ARGV.

Vous pouvez transmettre ces variables à la fonction UIApplicationMain dans l'application iOS:

Swift 3:

let argc = CommandLine.argc
let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc))
UIApplicationMain(argc, argv, nil, NSStringFromClass(AppDelegate.self))

versions précédentes Swift:

UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate.self))

ou:

UIApplicationMain(C_ARGC, C_ARGC, nil, NSStringFromClass(AppDelegate.self))

Objectif c:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
11
Darrarski
     import Foundation


     println(C_ARGC) //CInt    
     println(C_ARGV) // CString

Comme dans le code ci-dessus, vous pouvez utiliser C_ARGC pour obtenir le nombre d'arguments. C_ARGV pour obtenir ces arguments.

1
Waruna