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