如何在Swift中访问程序参数?

如何在Swift中访问程序参数?,swift,command-line,command-line-arguments,Swift,Command Line,Command Line Arguments,C和衍生工具的入口点函数有argc和argv(和envp)参数,但Swift没有一个合适的参数:顶级代码只是代码,没有参数 如何在Swift程序中访问等价的argc和argv import Foundation println(C_ARGC) //CInt println(C_ARGV) // CString 在上面的代码中,可以使用C_ARGC获取参数的数量。C_ARGV获取此参数。一旦您的应用程序启动,我将使用流程信息: let args = NS

C和衍生工具的入口点函数有
argc
argv
(和
envp
)参数,但Swift没有一个合适的参数:顶级代码只是代码,没有参数

如何在Swift程序中访问等价的
argc
argv

     import Foundation


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

在上面的代码中,可以使用C_ARGC获取参数的数量。C_ARGV获取此参数。

一旦您的应用程序启动,我将使用流程信息:

let args = NSProcessInfo.processInfo().arguments
print(args)
那里没有不安全的东西,很方便


请注意,您必须
导入Foundation
(或
Cocoa
/
UIKit
)。

过程。参数是您的朋友

幸运的是,这非常容易,而且是内置的:不需要导入任何东西,不需要使用C、objective或其他语言

考虑到这一点,我们称之为
args.swift

Swift 2版本:

var c = 0;
for arg in Process.arguments {
    println("argument \(c) is: \(arg)")
    c++
}
var c = 0;
for arg in CommandLine.arguments {
    print("argument \(c) is: \(arg)")
    c += 1
}
Swift 3版本:

var c = 0;
for arg in Process.arguments {
    println("argument \(c) is: \(arg)")
    c++
}
var c = 0;
for arg in CommandLine.arguments {
    print("argument \(c) is: \(arg)")
    c += 1
}
我们可以这样编译和运行它:

$ 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
请注意,第一个参数是程序名,正如您所期望的那样

正如您所料,似乎每个参数都是一个字符串


我非常希望随着Swift的成熟,
Process
变得更加有用,但现在它似乎只给了你一些论据。如果你想编写一个纯粹的Swift程序,这就太多了。

进程刚刚被重命名为命令行(从Swift 3.0 8月4日快照开始)


(由于某些原因,上没有提到这一点)

对于Swift 3,您可以使用以下代码:

let argc = CommandLine.argc
let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc))
对于较旧版本的Swift,您可以使用
Process.argc
Process.ARGV
C_argc
C_ARGV

您可以将此变量传递给iOS应用程序中的
UIApplicationMain
函数:

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))
或:

目标C:

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

这并不能回答这个问题。批评或要求作者澄清,在他们的帖子下方留下评论。添加了一个额外的解释看起来你必须手动输入
导入基础
,否则它将失败,出现
错误:使用未解析标识符“NSProcessInfo”
如果你不想要任何ObjectiveC代码,你可以导入Darwin。@DavidH不获取you@Daij-Djan很抱歉错过了你的问题-“导入Darwin”应该只导入C库,因此不导入ObjectiveC库。然后,应该可以像其他人在其他答案中提到的那样使用“流程”。NSProcessInfo是objC,在Foundation中,您还可以使用
swift-i
运行类似Python或Ruby脚本的swift代码;与
流程一起。参数
Swift构成了一个。是否有
流程
的文档?同上,我在哪里可以找到流程的信息?
流程
在这里(最后)有文档记录:打字错误
swiftc-o args…
而不是
swift-o args…
?这是Xcode 8 Beta 6的正确答案。这是我在这里注意到的众多更改中的一个:……或者,更简单地说,@zneak当然,这是最简单的方法,但您不能将其传递到
UIApplicationMain
函数中,您必须使用前面提到的
UnsafemeutableRawPointer
。我明白了。我只做macOS开发。在我们这边,仅仅拥有一个app委托就会导致编译器创建一个调用NSApplicationMain的主函数。我假设iOS上也会发生类似的事情。
UIApplicationMain(C_ARGC, C_ARGC, nil, NSStringFromClass(AppDelegate.self))
int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}