2016-12-23 10 views
3

私はMichele Dall'Agata's nice stackoverflow contributionから持っスウィフト3のコマンドライン引数でのgetoptを使用しようとしている:Swift 3でgetoptコマンドライン引数を使用するにはどうすればよいですか?

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の2番目の引数の正しい構文を知っていますか?前もって感謝します!

+0

実際のエラーをコピーしてください。 – Alexander

+0

Xcodeのエラーは、CommandLine.argumentsの上に表示されるとおりです。 – Dribbler

+0

'' UnsafePointer?>! ''部分でさえ? – Alexander

答えて

6

@Hamishはすでに質問に答えてスウィフトにgetopt()CommandLine.unsafeArgvを渡す方法を説明した(と理由)。あなたがここに(スウィフトの文字列を渡すことができ

  • 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 ?? "?") 
    

    備考:ここで

    は、典型的なgetoptの ループはスウィフト3に実装することができるか、完全な自己完結型の例である"abc:" )を(定数)C文字列を期待するC 関数に直接渡すと、コンパイラは自動的に で一時的なUTF-8表現を生成します。
  • getopt()-1(引数リストを使い果たした場合)またはunsigned charintに変換して返します。したがって、 が戻り値をCUnsignedChar(SwiftのUInt8)に変換することは安全です。
  • whileは、典型的なCパターンスイフトで

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

    を実装するためにパターンマッチングと追加 ブール条件で(悪用?)が使用されます。

5

CommandLine.argumentsはあなたに渡される引数の友好スウィフト[String]を与える - あなたはそのためバックストレートC.に引数を送信するために探している、しかし、あなたは、単にあなたに渡さargvの実際の生の値を与えるであろう、代わりにCommandLine.unsafeArgvを使用することができますあなたのプログラム。

let option = Int(getopt(CommandLine.argc, CommandLine.unsafeArgv, buffer)) 
関連する問題