【问题标题】:How can I use getopt with command line arguments in Swift 3?如何在 Swift 3 中将 getopt 与命令行参数一起使用?
【发布时间】:2017-05-09 10:03:17
【问题描述】:

我正在尝试在 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 ) )

我得到这个错误:

无法将“[String]”类型的值转换为预期的参数类型 'UnsafePointer?>!'

对于 CommandLine.arguments,我尝试将其用作 argv。有谁知道getopt 的第二个参数的正确语法?提前致谢!

【问题讨论】:

  • 请复制实际错误。
  • 这是 Xcode 中的错误,与 CommandLine.arguments 上方完全相同。
  • 即使是'UnsafePointer?>!' 部分?
  • 当我回到控制台前时,我会检查三次,但我相信是的。
  • @Alexander 这是一个降价格式错误;我修好了

标签: swift command-line swift3


【解决方案1】:

@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(如果参数列表已用尽)或转换为intunsigned char。因此是安全的 将返回值转换为 CUnsignedChar(在 Swift 中为 UInt8)。
  • while 与模式匹配一​​起使用(滥用?)加上一个额外的 实现典型 C 模式的布尔条件

    while ((option = getopt(argc, argv, "abc:")) != -1) { ... }
    

    在 Swift 中。

【讨论】:

    【解决方案2】:

    CommandLine.arguments 为您提供了一个友好的 Swift [String] 传递的参数 - 但是您希望将参数直接发送回 C。因此您可以简单地使用 CommandLine.unsafeArgv 代替,这将为您提供实际的原始数据argv 的值传递给您的程序。

    let option = Int( getopt( CommandLine.argc, CommandLine.unsafeArgv, buffer ) )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多