Swiftのコマンドラインアプリケーションのコマンドライン引数にどのようにアクセスしますか?
最上位の定数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
変数は実際には配列ではなく、配列のようにサブスクリプト化可能です。
更新01/17/17: Swift 3の例を更新しました。Process
はCommandLine
に名前が変更されました。
2015年9月30日更新: Swiftで動作するように例を更新しました2。
FoundationorC_ARGV
およびC_ARGC
なしでこれを行うことは実際に可能です。
Swift標準ライブラリには、CommandLine
と呼ばれるString
sのコレクションを持つarguments
構造体が含まれています。したがって、次のように引数をオンに切り替えることができます。
for argument in CommandLine.arguments {
switch argument {
case "arg1":
print("first argument")
case "arg2":
print("second argument")
default:
print("an argument")
}
}
古い "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)])!)'")
}