web-dev-qa-db-ja.com

Swiftでコマンドライン引数にアクセスするにはどうすればよいですか?

Swiftのコマンドラインアプリケーションのコマンドライン引数にどのようにアクセスしますか?

108
Anthony Mittaz

最上位の定数C_ARGCおよびC_ARGVを使用します。

for i in 1..C_ARGC {
    let index = Int(i);

    let arg = String.fromCString(C_ARGV[index])
    switch arg {
    case "this":
        println("this yo");

    case "that":
        println("that yo")

    default:
        println("dunno bro")
    }
}

1..C_ARGC "配列"の最初の要素はアプリケーションのパスであるため、C_ARGVの範囲を使用していることに注意してください。

C_ARGV変数は実際には配列ではなく、配列のようにサブスクリプト化可能です。

44
orj

更新01/17/17: Swift 3の例を更新しました。ProcessCommandLineに名前が変更されました。


2015年9月30日更新: Swiftで動作するように例を更新しました2。


FoundationorC_ARGVおよびC_ARGCなしでこれを行うことは実際に可能です。

Swift標準ライブラリには、CommandLineと呼ばれるStringsのコレクションを持つarguments構造体が含まれています。したがって、次のように引数をオンに切り替えることができます。

for argument in CommandLine.arguments {
    switch argument {
    case "arg1":
        print("first argument")

    case "arg2":
        print("second argument")

    default:
        print("an argument")
    }
}
290
Mark Adams

Swift 3では、CommandLineの代わりに Process enumを使用します

そう:

let arguments = CommandLine.arguments
54
Maciek Czarnik

古い "getopt"(Swiftで利用可能)を使用したい人は誰でもこれを参照として使用できます。 CのSwiftサンプルのGNUポートを作成しました。

http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html

完全な説明付き。テスト済みで完全に機能しています。 Foundationも必要ありません。

var aFlag   = 0
var bFlag   = 0
var cValue  = String()

let pattern = "abc:"
var buffer = Array(pattern.utf8).map { Int8($0) }

while  true {
    let option = Int(getopt(C_ARGC, C_ARGV, buffer))
    if option == -1 {
        break
    }
    switch "\(UnicodeScalar(option))"
    {
    case "a":
        aFlag = 1
        println("Option -a")
    case "b":
        bFlag = 1
        println("Option -b")
    case "c":
        cValue = String.fromCString(optarg)!
        println("Option -c \(cValue)")
    case "?":
        let charOption = "\(UnicodeScalar(Int(optopt)))"
        if charOption == "c" {
            println("Option '\(charOption)' requires an argument.")
        } else {
            println("Unknown option '\(charOption)'.")
        }
        exit(1)
    default:
        abort()
    }
}
println("aflag ='\(aFlag)', bflag = '\(bFlag)' cvalue = '\(cValue)'")

for index in optind..<C_ARGC {
    println("Non-option argument '\(String.fromCString(C_ARGV[Int(index)])!)'")
}
12