คุณเข้าถึงอาร์กิวเมนต์บรรทัดคำสั่งสำหรับแอปพลิเคชันบรรทัดคำสั่งใน Swift ได้อย่างไร
คุณเข้าถึงอาร์กิวเมนต์บรรทัดคำสั่งสำหรับแอปพลิเคชันบรรทัดคำสั่งใน Swift ได้อย่างไร
คำตอบ:
Apple ได้เปิดตัวArgumentParserไลบรารีเพื่อทำสิ่งนี้:
เรามีความยินดีที่จะประกาศ
ArgumentParserไลบรารีโอเพนซอร์สใหม่ที่ทำให้ตรงไปตรงมา - สนุกสนานได้! - เพื่อแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งใน Swift
https://github.com/apple/swift-argument-parser
เริ่มต้นด้วยการประกาศประเภทที่กำหนดข้อมูลที่คุณต้องการรวบรวมจากบรรทัดคำสั่ง ตกแต่งสถานที่ให้บริการเก็บไว้แต่ละคนมีหนึ่ง
ArgumentParser'sParsableCommandห่อทรัพย์สินและประกาศความสอดคล้องกับ
ArgumentParserห้องสมุดแยกอาร์กิวเมนต์บรรทัดคำสั่งที่ instantiates ประเภทคำสั่งของคุณและจากนั้นดำเนินการกำหนดเองของคุณrun()วิธีการหรือออกพร้อมกับข้อความที่มีประโยชน์
ปรับปรุง 01/17/17: Updated ตัวอย่างสำหรับสวิฟท์ 3. ได้รับการเปลี่ยนชื่อเป็นProcessCommandLine
อัปเดต 30/09/2015:อัปเดตตัวอย่างเพื่อทำงานใน Swift 2
เป็นจริงไปได้ที่จะทำเช่นนี้โดยมูลนิธิหรือ และC_ARGVC_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_ARGCC_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) สามารถใช้สิ่งนี้เป็นข้อมูลอ้างอิงได้ ฉันสร้างพอร์ต Swift ของตัวอย่าง GNU ใน 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.argumentsArray และเพิ่มตรรกะที่คุณต้องการ
คุณสามารถทดสอบได้ สร้างไฟล์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
ปัญหาในการสร้างตัวแยกวิเคราะห์อาร์กิวเมนต์ของคุณเองคือการพิจารณาข้อตกลงอาร์กิวเมนต์บรรทัดคำสั่งทั้งหมด ฉันอยากจะแนะนำให้ใช้ Argument Parser ที่มีอยู่
คุณสามารถใช้:
ฉันได้เขียนเกี่ยวกับวิธีการสร้างเครื่องมือบรรทัดคำสั่งในทั้งสาม คุณควรตรวจสอบและตัดสินใจว่าสไตล์ใดที่เหมาะกับคุณที่สุด
หากคุณสนใจนี่คือลิงค์: