답변:
Apple ArgumentParser
은이를 위해 라이브러리를 출시했습니다 .
ArgumentParser
간단하고 즐겁게 사용할 수있는 새로운 오픈 소스 라이브러리 인 을 발표하게되어 기쁩니다 ! — Swift에서 명령 줄 인수를 구문 분석합니다.
https://github.com/apple/swift-argument-parser
명령 줄에서 수집해야하는 정보를 정의하는 유형을 선언하여 시작합니다.
ArgumentParser
의 속성 래퍼 중 하나를 사용하여 저장된 각 속성을 장식 하고ParsableCommand
.
ArgumentParser
라이브러리는 명령 줄 인수를 구문 분석 명령 유형을 인스턴스화 한 다음 중 하나를 사용자 정의 실행run()
유용한 메시지와 함께 방법 또는 종료.
업데이트 01/17/17 : Swift 3의 예제가 업데이트 Process
되었습니다 CommandLine
.
업데이트 09/30/2015 : Swift 2에서 작동하도록 예제를 업데이트했습니다.
실제로 Foundation 또는 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에서 사용 가능)를 사용하려는 사람은 누구나 이것을 참조로 사용할 수 있습니다. C에서 GNU 예제의 Swift 포트를 만들었습니다.
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
자체 인수 구문 분석기를 작성하는 데있어 문제는 모든 명령 줄 인수 규칙을 고려하는 것입니다. 기존 Argument Parser를 사용하는 것이 좋습니다.
다음을 사용할 수 있습니다.
세 가지 모두에서 명령 줄 도구를 빌드하는 방법에 대해 작성했습니다. 당신은 그것들을 확인하고 당신에게 가장 적합한 스타일을 결정해야합니다.
관심이 있다면 여기에 링크가 있습니다.