我试图在 Swift 3中使用带有命令行参数的getopt.我从 Michele Dall’Agata’s nice stackoverflow contribution开始: let pattern = "abc:"var buffer = Array( pattern.utf8 ).map { Int8($0) } 当我然后使用此代码时: l
let pattern = "abc:" var buffer = Array( pattern.utf8 ).map { Int8($0) }
当我然后使用此代码时:
let option = Int( getopt( CommandLine.argc, CommandLine.arguments, buffer ) )
我收到此错误:
Cannot convert value of type ‘[String]’ to expected argument type
‘UnsafePointer<UnsafeMutablePointer<Int8>?>!’
对于CommandLine.arguments,我试图将其用作argv.有没有人知道getopt的第二个参数的正确语法?提前致谢!
@Hamish已经回答了这个问题并解释了如何在Swift中将CommandLine.unsafeArgv传递给getopt()(以及为什么).这是一个完整的自包含示例如何典型的getopt
循环可以在Swift 3中实现:
var aFlag = false var bFlag = false var cValue: String? while case let option = getopt(CommandLine.argc, CommandLine.unsafeArgv, "abc:"), option != -1 { switch UnicodeScalar(CUnsignedChar(option)) { case "a": aFlag = true case "b": bFlag = true case "c": cValue = String(cString: optarg) default: fatalError("Unknown option") } } print(aFlag, bFlag, cValue ?? "?")
备注:
>您可以将Swift字符串(此处:“abc:”)直接传递给C
函数期望一个(常量)C字符串,编译器会自动执行
生成临时UTF-8表示.
> getopt()返回-1(如果参数列表已用尽)或unsigned char转换为int.因此它是安全的
将返回值转换为CUnsignedChar(在Swift中为UInt8).
>使用(滥用?)与模式匹配加一个额外的
布尔条件实现典型的C模式
while ((option = getopt(argc, argv, "abc:")) != -1) { ... }
在斯威夫特.