文章目录

服务器端程序经常会在启动时候传入一些命令行参数执行不同的功能,最典型命令是开始和结束命令:

1
2
-> % yourserver start
-> % yourserver stop

在 C 语言中,入口函数main自带两个参数用于获取命令行参数:

1
int main( int argc, char *argv[] ) /* 带参数形式 */

argc告诉我们命令行参数的数量,二维指针argv指向这些参数值的实际地址。开发过服务器端代码的同学对这个知识应该是相当了解了。那么在 Swift 中应该怎么获取呢?

Swift 标准库提供了一个枚举类型来获取命令行的信息:CommandLine, 带有两个类型变量:argcarguments,前一个是Int32类型,后一个是字符串数组,分别获取参数个数和参数值:

1
2
3
4
5
6
7
8
let argCount = CommandLine.argc
let arguments = CommandLine.arguments
print(argCount)
for argument in arguments {
print(argument)
}

编译执行以后,会打印以下信息:

1
2
3
4
5
6
7
-> % ./.build/debug/SwiftCommandLine
1
./.build/debug/SwiftCommandLine
-> % ./.build/debug/SwiftCommandLine start
2
./.build/debug/SwiftCommandLine
start

可以看到,第一个参数存在,存储的是可执行文件的当前路径。也就是说,argc永远都不会为0。
另外需要注意的是,arguments的类型是[String],使用下标访问参数值时,需要提前确认下标是否越界,否则执行时候将会报错退出。

CommandLine还提供了一个访问 C 语言原始值的类型属性unsafeArgv,类型是UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>。不推荐使用:

1
2
3
4
5
6
var point: UnsafeMutablePointer<Int8>? = CommandLine.unsafeArgv[0]
if let temp = point {
let str = String(cString: temp)
print(str)
}

标准库文档中关于CommandLine的说明看这里

文章目录