¿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.