swift command-line command-line-arguments

¿Cómo accedo a los argumentos del programa en Swift?



command-line command-line-arguments (5)

C y los derivados tienen parámetros argc y argv (y envp ) para sus funciones de punto de entrada, pero Swift no tiene uno adecuado: el código de nivel superior es solo código y no tiene parámetros.

¿Cómo se puede acceder al equivalente de argc y argv en un programa Swift?


Para Swift 3 puedes usar este código:

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

que es equivalente a los parámetros argc y argv utilizados en la función principal de Objective-C:

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

Para versiones anteriores de Swift, puede usar Process.argc y Process.unsafeArgv o C_ARGC y C_ARGV .

Puede pasar estas variables a la función UIApplicationMain en la aplicación 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))

Versiones Swift anteriores:

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

o:

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

C objetivo:

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


Tan pronto como su aplicación esté lista, usaría la información del proceso:

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

Nada inseguro allí, muy conveniente.

Tenga en cuenta que debe import Foundation (o Cocoa / UIKit ).


Process.arguments es tu amigo!

Afortunadamente, esto es mucho más fácil y está integrado: no importa nada, no se ensucia las manos con C, sea objetivo o no.

Considera esto, llamémoslo args.swift :

Versión Swift 2 :

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

Versión Swift 3 :

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

Podemos compilarlo y ejecutarlo así:

$ 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

Tenga en cuenta que el primer argumento es el nombre del programa, como es de esperar.

Parece que cada argumento es un String, como es de esperar.

Espero mucho que el Process vuelva más útil a medida que Swift madure, pero en este momento parece que solo te dan los argumentos. Lo cual es mucho, si estás tratando de escribir un programa puro-Swift.


El proceso acaba de cambiar su nombre a CommandLine (desde la instantánea de Swift 3.0 del 4 de agosto)

let arguments = CommandLine.arguments

(por alguna razón esto no fue mencionado en el changelog )


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

Como en el código anterior, puede usar C_ARGC para obtener el número de argumentos. C_ARGV para obtener estos argumentos.