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?
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 )
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.
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
).
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]));
}
}
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.