C语言及其衍生语言在入口函数中有argc
、argv
(以及envp
)参数,但Swift没有一个合适的入口函数:顶层代码只是代码,它没有参数。
那么,在Swift程序中如何访问等效于argc
和argv
的内容?
C语言及其衍生语言在入口函数中有argc
、argv
(以及envp
)参数,但Swift没有一个合适的入口函数:顶层代码只是代码,它没有参数。
那么,在Swift程序中如何访问等效于argc
和argv
的内容?
Process 刚被重命名为 CommandLine(自 Swift 3.0 8月4日快照版起)。
let arguments = CommandLine.arguments
(由于某种原因,这在更改日志中没有提到)
Process.arguments
是你的好帮手!
幸运的是,这非常容易,而且已经内置:无需导入任何东西,也不需要用C、Objective或其他方式动手。
考虑下面这个示例,我们将其称为 args.swift
:
Swift 2 版本:
var c = 0;
for arg in Process.arguments {
println("argument \(c) is: \(arg)")
c++
}
Swift 3 版本:
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 -i
像运行 Python 或 Ruby 脚本一样运行 Swift 代码;结合 Process.arguments
,Swift 成为了一种有前途的脚本语言。参考链接 - JoeProcess
有没有相关文档? - alaroldaiProcess
终于在这里有了文档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Reference/Swift_Process_Enumeration/ - cabbeyswift -o args ...
而不是 swiftc -o args...
? - Jan ATAC一旦您的应用程序启动,我将使用进程信息:
let args = NSProcessInfo.processInfo().arguments
print(args)
没有任何不安全的地方,非常方便。
请注意你需要import Foundation
(或者Cocoa
/UIKit
)。
import Foundation
才能使它工作,否则会出现 error: use of unresolved identifier 'NSProcessInfo'
的错误。 - Brad Dwyer对于 Swift 3,您可以使用以下代码:
let argc = CommandLine.argc
let argv = UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc))
这相当于 Objective-C 主函数中使用的 argc
和 argv
参数:
int main(int argc, char *argv[])
对于旧版本的Swift,您可以使用Process.argc
和Process.unsafeArgv
或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))
之前的 Swift 版本:
UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate.self))
或者:UIApplicationMain(C_ARGC, C_ARGC, nil, NSStringFromClass(AppDelegate.self))
Objective-C:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplicationMain
函数,你必须使用提到的UnsafeMutableRawPointer
。 - Darrarski一个优雅的替代CommandLine.arguments
是Swift Argument Parser。 ArgumentParser
将为您解析命令行参数,将参数映射到struct
中。它提供了所有您期望从命令行应用程序中获得的功能,包括类型安全解析参数、自动帮助功能、短选项和长选项等。
只需使用“Swift Package Manager”将ArgumentParser
包添加到您的命令行项目中(例如,在Xcode的“文件”»“添加包”命令中)。
import Foundation
println(C_ARGC) //CInt
println(C_ARGV) // CString