Swift'deki bir komut satırı uygulaması için komut satırı argümanlarına nasıl erişirsiniz?
Swift'deki bir komut satırı uygulaması için komut satırı argümanlarına nasıl erişirsiniz?
Yanıtlar:
Apple, ArgumentParser
yalnızca bunu yapmak için kitaplığı yayınladı :
ArgumentParser
Bunu basit, hatta eğlenceli hale getiren yeni bir açık kaynak kitaplığını duyurmaktan mutluluk duyuyoruz ! - Swift'deki komut satırı argümanlarını ayrıştırmak için.
https://github.com/apple/swift-argument-parser
Komut satırından toplamanız gereken bilgileri tanımlayan bir tür bildirerek başlayın. Depolanan her bir
ArgumentParser
mülkü, ürününün özellik sarmalayıcılarından biriyle dekore edin ve uygunluğunu beyan edinParsableCommand
.
ArgumentParser
Kütüphane, komut satırı bağımsız değişkenleri ayrıştırır komut tipi başlatır ve sonra ya özel yürütürrun()
yararlı olan bir mesaj ile bir yöntem ya da çıkış.
Güncelleme 01/17/17: Swift 3 için örnek güncellendi. OlarakProcess
yeniden adlandırıldı CommandLine
.
30.09.2015 Güncellemesi: Örnek, Swift 2'de çalışacak şekilde güncellendi .
Bunu Foundation veya C_ARGV
ve olmadan yapmak aslında mümkündür C_ARGC
.
Swift standart kitaplığı, adı verilen CommandLine
bir koleksiyona sahip bir yapı içerir . Böylece aşağıdaki gibi argümanları açabilirsiniz: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
aynı mı NSProcessInfo.processInfo().arguments
?
Process
nesne artık nesne olarak bilinir CommandLine
. Swift 3.0 resmi olarak piyasaya sürüldüğünde bu muhtemelen tamamen dahil edilecek.
Üst düzey sabitleri C_ARGC
ve 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")
}
}
"Dizi" nin 1..C_ARGC
ilk öğesi C_ARGV
uygulamanın yolu olduğu için aralığını kullandığıma dikkat edin .
C_ARGV
Değişken aslında bir dizi değil ama alt script bir dizi gibi.
C_ARCG
artık desteklenmiyor gibi görünüyor.
Process.argc
ve Process.arguments
bu gibi görünüyor olsa bunun için, değişen olabilir CommandLine.argc
ve CommandLine.arguments
bu dil için en son değişikliklerle.
(Swift'de bulunan) eski "getopt" u kullanmak isteyen herkes bunu referans olarak kullanabilir. C'deki GNU örneğinin bir Swift portunu şu adreste bulabilirim:
http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
tam bir açıklama ile. Test edildi ve tamamen işlevsel. Foundation da gerektirmez.
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)])!)'")
}
Array'i kullanarak bir argüman ayrıştırıcısı oluşturabilir CommandLine.arguments
ve istediğiniz herhangi bir mantığı ekleyebilirsiniz.
Test edebilirsiniz. Bir dosya oluşturarguments.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)
}
derleyin ve çalıştırın:
$ swiftc arguments.swift
$ ./arguments argument1 argument2 argument3
Kendi bağımsız değişken çözümleyicinizi oluştururken yaşadığınız sorun, tüm komut satırı bağımsız değişken kurallarını hesaba katmaktır. Mevcut bir Argüman Ayrıştırıcı kullanmanızı tavsiye ederim.
Kullanabilirsin:
Üçünde de komut satırı araçlarının nasıl oluşturulacağı hakkında yazdım. Onları kontrol etmeli ve hangi tarzın size en uygun olduğuna karar vermelisiniz.
Eğer ilgileniyorsanız, buradaki bağlantılar: