回答:
AppleはArgumentParser
これを行うためのライブラリをリリースしました:
ArgumentParser
新しいオープンソースライブラリを簡単に、しかも楽しくすることができることをお知らせいたします。— Swiftでコマンドライン引数を解析します。
https://github.com/apple/swift-argument-parser
コマンドラインから収集する必要がある情報を定義するタイプを宣言することから始めます。格納されている各プロパティをいずれか
ArgumentParser
のプロパティラッパーで装飾し、への適合を宣言しParsableCommand
ます。
ArgumentParser
ライブラリは、コマンドライン引数を解析し、あなたのコマンドタイプをインスタンス化して、いずれかのカスタム実行run()
に有用Aメッセージとメソッドまたは終了を。
更新01/17/17: Swift 3の例を更新しました。Process
名前はに変更されましたCommandLine
。
2015年9月30日更新: Swift 2で機能するように例を更新しました。
Foundation または C_ARGV
and なしでこれを行うことは実際に可能C_ARGC
です。
Swift標準ライブラリには、と呼ばれるのCommandLine
コレクションを持つ構造体が含まれています。したがって、次のように引数をオンにすることができます。String
arguments
for argument in CommandLine.arguments {
switch argument {
case "arg1":
print("first argument")
case "arg2":
print("second argument")
default:
print("an argument")
}
}
Process.arguments
同じNSProcessInfo.processInfo().arguments
ですか?
Process
オブジェクトはオブジェクトと呼ばれていCommandLine
ます。Swift 3.0が正式にリリースされたら、これはおそらく完全に組み込まれるでしょう。
トップレベルの定数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
変数は、実際には配列ではなく、配列のように、サブスクリプト可能です。
C_ARCG
サポートされなくなったようです。
Process.argc
し、Process.arguments
それはこのようになりますけれども、このために変更される可能性がありますCommandLine.argc
し、CommandLine.arguments
言語への最新の変更で。
古い「getopt」(Swiftで入手可能)を使用したい人は、これを参照として使用できます。私はGNUの例のSwift移植をCで作成しました。
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)])!)'")
}
CommandLine.arguments
Arrayを使用して引数パーサーを作成し、好きなロジックを追加できます。
あなたはそれをテストすることができます。ファイルを作成するarguments.swift
//Remember the first argument is the name of the executable
print("you passed \(CommandLine.arguments.count - 1) argument(s)")
print("And they are")
for argument in CommandLine.arguments {
print(argument)
}
コンパイルして実行します。
$ swiftc arguments.swift
$ ./arguments argument1 argument2 argument3
独自の引数パーサーを作成する際の問題は、すべてのコマンドライン引数の規則を考慮に入れていることです。既存の引数パーサーを使用することをお勧めします。
あなたは使うことができます:
3つすべてでコマンドラインツールを構築する方法について書きました。あなたはそれらをチェックして、どのスタイルがあなたに最も適しているかを決めるべきです。
あなたが興味を持っているならここにリンクがあります: