Bagaimana Anda mengakses argumen baris perintah untuk aplikasi baris perintah di Swift?
Bagaimana Anda mengakses argumen baris perintah untuk aplikasi baris perintah di Swift?
Jawaban:
Apple telah merilis ArgumentParser
perpustakaan untuk melakukan ini:
Kami dengan senang hati mengumumkan
ArgumentParser
, perpustakaan sumber terbuka baru yang membuatnya mudah - bahkan menyenangkan! - untuk mengurai argumen baris perintah di Swift.
https://github.com/apple/swift-argument-parser
Mulailah dengan mendeklarasikan tipe yang mendefinisikan informasi yang perlu Anda kumpulkan dari baris perintah. Hiasi setiap properti yang disimpan dengan salah satu
ArgumentParser
pembungkus properti, dan nyatakan kesesuaianParsableCommand
.The
ArgumentParser
perpustakaan mengurai argumen baris perintah, instantiates ketik perintah Anda, dan kemudian mengeksekusi kustom Andarun()
metode atau keluar dengan pesan yang bermanfaat.
Pembaruan 01/17/17: Memperbarui contoh untuk Swift 3. Process
telah diubah namanya menjadi CommandLine
.
Pembaruan 09/30/2015: Memperbarui contoh untuk bekerja di Swift 2.
Sebenarnya mungkin untuk melakukan ini tanpa Foundation atau C_ARGV
dan C_ARGC
.
Pustaka standar Swift berisi struct CommandLine
yang memiliki kumpulan String
s yang disebut arguments
. Jadi Anda bisa mengaktifkan argumen seperti ini:
for argument in CommandLine.arguments {
switch argument {
case "arg1":
print("first argument")
case "arg2":
print("second argument")
default:
print("an argument")
}
}
Process.arguments
sama dengan NSProcessInfo.processInfo().arguments
?
Process
objek sekarang dikenal sebagai CommandLine
objek. Ini mungkin akan digabungkan sepenuhnya setelah Swift 3.0 secara resmi dirilis.
Gunakan konstanta tingkat atas C_ARGC
dan 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")
}
}
Perhatikan bahwa saya menggunakan kisaran 1..C_ARGC
karena elemen pertama dari C_ARGV
"array" adalah jalur aplikasi.
The C_ARGV
variabel tidak benar-benar sebuah array tetapi sub-skrip seperti array.
C_ARCG
sepertinya tidak lagi didukung.
Process.argc
dan Process.arguments
untuk ini, meskipun sepertinya ini mungkin berubah menjadi CommandLine.argc
dan CommandLine.arguments
dengan perubahan terbaru pada bahasa.
Siapapun yang ingin menggunakan "getopt" lama (yang tersedia di Swift) dapat menggunakan ini sebagai referensi. Saya membuat port Swift dari contoh GNU di C yang dapat ditemukan di:
http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
dengan deskripsi lengkap. Sudah teruji dan berfungsi penuh. Itu juga tidak membutuhkan 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)])!)'")
}
Anda bisa membuat pengurai argumen dengan menggunakan CommandLine.arguments
Array dan menambahkan logika apa pun yang Anda suka.
Anda bisa mengujinya. Buat filearguments.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)
}
kompilasi dan jalankan:
$ swiftc arguments.swift
$ ./arguments argument1 argument2 argument3
Masalah dengan Anda membangun parser argumen Anda sendiri adalah dengan mempertimbangkan semua konvensi argumen baris perintah. Saya akan merekomendasikan menggunakan Argument Parser yang sudah ada.
Anda bisa menggunakan:
Saya telah menulis tentang bagaimana membangun alat baris perintah pada ketiganya. Anda harus memeriksanya dan memutuskan gaya apa yang paling cocok untuk Anda.
Jika Anda tertarik, berikut adalah tautannya: