आप स्विफ्ट में कमांड लाइन एप्लिकेशन के लिए कमांड लाइन तर्क कैसे एक्सेस करते हैं?
आप स्विफ्ट में कमांड लाइन एप्लिकेशन के लिए कमांड लाइन तर्क कैसे एक्सेस करते हैं?
जवाबों:
Apple ने ArgumentParser
यह करने के लिए पुस्तकालय जारी किया है :
हमें घोषणा करते हुए खुशी हो रही है
ArgumentParser
, एक नया ओपन-सोर्स लाइब्रेरी जो इसे सीधा बनाता है - यहां तक कि सुखद भी! - स्विफ्ट में कमांड-लाइन तर्कों को पार्स करने के लिए।
https://github.com/apple/swift-argument-parser
एक प्रकार की घोषणा करके शुरू करें जो आपको कमांड लाइन से एकत्रित की जाने वाली जानकारी को परिभाषित करता है। प्रत्येक संग्रहीत संपत्ति को एक
ArgumentParser
संपत्ति के रैपर से सजाएं, और उसके अनुरूप घोषित करेंParsableCommand
।
ArgumentParser
पुस्तकालय कमांड लाइन तर्क या तो पार्स करता है, अपने आदेश प्रकार को दर्शाता है, और उसके बाद अपने कस्टम कार्यान्वितrun()
उपयोगी एक संदेश के साथ विधि या बाहर निकलता है।
अद्यतन ०१/१17/१ been: स्विफ्ट ३ के लिए उदाहरण का अद्यतन Process
किया गया है CommandLine
।
अपडेट 09/30/2015: स्विफ्ट 2 में काम करने के लिए उदाहरण को अपडेट करें।
यह वास्तव में फाउंडेशन के बिना ऐसा करना संभव है या C_ARGV
और C_ARGC
।
स्विफ्ट मानक पुस्तकालय में एक संरचना 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
ऑब्जेक्ट के रूप में जाना जाता है । स्विफ्ट 3.0 के आधिकारिक तौर पर जारी होने के बाद यह संभवत: पूरी तरह से शामिल हो जाएगा।
स्विफ्ट 3 में के CommandLine
बजाय एनम का उपयोग करेंProcess
इसलिए:
let arguments = CommandLine.arguments
शीर्ष स्तरीय स्थिरांक का उपयोग करें 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" का उपयोग करना चाहता है (जो स्विफ्ट में उपलब्ध है) इसे संदर्भ के रूप में उपयोग कर सकते हैं। मैंने C में GNU उदाहरण का एक स्विफ्ट पोर्ट बनाया है:
http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html
पूरे विवरण के साथ। यह परीक्षण किया गया है और पूरी तरह कार्यात्मक है। यह फाउंडेशन की भी आवश्यकता नहीं है।
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
ऐरे और अपनी पसंद का कोई भी तर्क जोड़ सकते हैं।
आप इसका परीक्षण कर सकते हैं। एक फ़ाइल बनाएँ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
आपके अपने तर्क पार्सर के निर्माण के साथ समस्या सभी कमांड लाइन तर्क सम्मेलनों को ध्यान में रख रही है। मैं एक मौजूदा तर्क पार्सर का उपयोग करने की सलाह दूंगा।
आप उपयोग कर सकते हैं:
मैंने तीनों पर कमांड-लाइन टूल बनाने का तरीका लिखा है। आपको उनकी जांच करनी चाहिए और तय करना चाहिए कि आपको कौन सी शैली सबसे अच्छी लगती है।
यदि आप यहाँ रुचि रखते हैं लिंक हैं: