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

zne*_*eak 36 command-line command-line-arguments swift

C和衍生物具有argcargv(和envp)参数到它们的入口点函数,但是Swift没有一个正确的:顶级代码只是代码,它没有参数.

一个人怎么可以访问相当于argcargv在斯威夫特程序?

amb*_*ght 45

进程刚刚重命名为CommandLine(自Swift 3.0 8月4日快照)

let arguments = CommandLine.arguments
Run Code Online (Sandbox Code Playgroud)

(由于某种原因,更改日志中未提及此内容)

  • 现在,这是使用Xcode 8 Beta 6的正确答案。我在此处注意到的众多更改之一是:http://www.brightdigit.com/blog/16/08/17/updating-for-xcode-8-beta-6 / (2认同)

Kev*_*ost 38

Process.arguments 是你的朋友!

幸运的是,这更容易,内置:不进口任何东西,没有用C,客观或其他方式弄脏你的手.

考虑一下,让我们称之为args.swift:

Swift 2版本:

var c = 0;
for arg in Process.arguments {
    println("argument \(c) is: \(arg)")
    c++
}
Run Code Online (Sandbox Code Playgroud)

Swift 3版本:

var c = 0;
for arg in CommandLine.arguments {
    print("argument \(c) is: \(arg)")
    c += 1
}
Run Code Online (Sandbox Code Playgroud)

我们可以像这样编译和运行它:

$ 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
Run Code Online (Sandbox Code Playgroud)

请注意,第一个参数是程序名称,如您所料.

似乎每个参数都是一个String,正如您可能也期望的那样.

我非常希望Process随着Swift的成熟变得更有用,但是现在它似乎只给你一些参数.如果您正在尝试编写纯Swift程序,那么这很多.

  • 是否有"过程"的文档? (3认同)

Dai*_*jan 12

一旦你的应用程序启动,我就会使用进程信息:

let args = NSProcessInfo.processInfo().arguments
print(args)
Run Code Online (Sandbox Code Playgroud)

那里没什么不安全的,非常方便.

请注意,您必须import Foundation(或Cocoa/ UIKit).


Dar*_*ski 11

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

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

这相当于Objective-C主要功能中使用的argcargv参数:

int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

对于旧版本的雨燕,你可以使用Process.argcProcess.unsafeArgvC_ARGCC_ARGV.

您可以将此变量传递给UIApplicationMainiOS应用中的功能:

斯威夫特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))
Run Code Online (Sandbox Code Playgroud)

以前的Swift版本:

UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate.self))
Run Code Online (Sandbox Code Playgroud)

要么:

UIApplicationMain(C_ARGC, C_ARGC, nil, NSStringFromClass(AppDelegate.self))
Run Code Online (Sandbox Code Playgroud)

Objective-C的:

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