macos command-line-arguments swift

macos - ¿Cómo se accede a los argumentos de línea de comando en Swift?



command-line-arguments (4)

¿Cómo se accede a los argumentos de línea de comando para una aplicación de línea de comando en Swift?


Cualquiera que quiera usar el antiguo "getopt" (que está disponible en Swift) puede usar esto como referencia. Hice un puerto de Swift del ejemplo de GNU en C que se puede encontrar en:

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

con una descripción completa. Es probado y completamente funcional. No requiere Fundación tampoco.

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


En Swift 3 use CommandLine enum en lugar de Process

Asi que:

let arguments = CommandLine.arguments


Actualización 17/01/17: se actualizó el ejemplo de Swift 3. Se cambió el nombre del proceso por CommandLine .

Actualización 30/09/2015: se actualizó el ejemplo para trabajar en Swift 2.

En realidad es posible hacer esto sin Foundation o C_ARGV y C_ARGC .

La biblioteca estándar Swift contiene una struct CommandLine que tiene una colección de String llamadas arguments . Entonces puedes activar argumentos como este:

for argument in CommandLine.arguments { switch argument { case "arg1": print("first argument"); case "arg2": print("second argument"); default: print("an argument"); } }


Use las constantes de nivel superior 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") } }

Tenga en cuenta que estoy usando el rango de 1..C_ARGC porque el primer elemento de la "matriz" C_ARGV es la ruta de la aplicación.

La variable C_ARGV no es en realidad una matriz, sino que es subcriptable como una matriz.