微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Swift 3中使用带有命令行参数的getopt?

我试图在 Swift 3中使用带有命令行参数的getopt.我从 Michele Dall’Agata’s nice stackoverflow contribution开始:

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) { ... }

在斯威夫特.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐