🔥 소개
ArgumentParser를 사용하면 커맨드 라인 인터페이스를 쉽고 간편하게 만들 수 있어요. @Argument, @Option, @Flag 속성 래퍼로 명령어 인터페이스를 선언할 수 있답니다.
명령어를 만들 때는 주로 세 가지 입력 종류를 정의할 수 있어요.
-
Arguments는 사용자가 제공하는 값으로, 첫 번째부터 마지막까지 순서대로 읽혀요. 예를 들면 다음 명령어는 파일 이름 세 개를 인자로 받아요.shell% example file1.swift file2.swift file3.swiftshell% example file1.swift file2.swift file3.swift -
Options는 이름이 있는 키-값 쌍이에요. 키는 대시가 한 개 또는 대시가 두 개( 또는-)로 시작하고, 사용자는 등호(=) 또는 공백으로 키와 값을 구분할 수 있어요. 다음 명령어는 옵션 두 개와 함께 호출했습니다.shell% example --count=5 --index 2shell% example --count=5 --index 2 -
Flags는 옵션과 비슷하지만, 값 없이 사용합니다. 플래그가 있으면 특정 값을 나타내는 거예요. 다음 명령어는 플래그 두 개와 함께 호출했습니다.shell% example --verbose --strip-whitespaceshell% example --verbose --strip-whitespace
앞서 본 세 가지 예시는 모두 다음과 같은 Example 명령어를 호출한 거예요.
struct Example: ParsableCommand {
@Argument var files: [String] = []
@Option var count: Int?
@Option var index = 0
@Flag var verbose = false
@Flag var stripWhitespace = false
}
struct Example: ParsableCommand {
@Argument var files: [String] = []
@Option var count: Int?
@Option var index = 0
@Flag var verbose = false
@Flag var stripWhitespace = false
}
이 예제는 ArgumentParser가 초기 개발 과정을 얼마나 빠르게 해주는지 보여줘요.
- 명령어 속성 이름을 바탕으로 옵션과 플래그 이름을 만듭니다.
- 속성 타입과 기본값으로 입력이 올바른지, 그리고 인자가 꼭 필요한지 정합니다.
이 예제에서는 모든 속성에 기본값이 있어요. (옵셔널 속성은 기본값으로 nil을 갖습니다.)
사용자는 기본값이 없는 모든 속성에 값을 제공해야 합니다. 예를 들어, 다음 명령어는 정수 인자 한 개와 --user-name 키를 가진 문자열이 필요해요.
struct Example: ParsableCommand {
@Option var userName: String
@Argument var value: Int
}
struct Example: ParsableCommand {
@Option var userName: String
@Argument var value: Int
}
두 값을 모두 제공하지 않고 호출하면, 명령어는 오류와 함께 종료돼요.
% example 5
Error: Missing '--user-name <user-name>'
Usage: example --user-name <user-name> <value>
See 'example --help' for more information.
% example --user-name kjohnson
Error: Missing '<value>'
Usage: example --user-name <user-name> <value>
See 'example --help' for more information.
% example 5
Error: Missing '--user-name <user-name>'
Usage: example --user-name <user-name> <value>
See 'example --help' for more information.
% example --user-name kjohnson
Error: Missing '<value>'
Usage: example --user-name <user-name> <value>
See 'example --help' for more information.
배열 속성에 기본값을 제공하면, 사용자가 제공한 값이 전체 기본값을 대체해요.
struct Lucky: ParsableCommand {
@Argument var numbers = [7, 14, 21]
mutating func run() throws {
print("""
Your lucky numbers are:
\(numbers.map(String.init).joined(separator: " "))
""")
}
}
struct Lucky: ParsableCommand {
@Argument var numbers = [7, 14, 21]
mutating func run() throws {
print("""
Your lucky numbers are:
\(numbers.map(String.init).joined(separator: " "))
""")
}
}
% lucky
Your lucky numbers are:
7 14 21
% lucky 1 2 3
Your lucky numbers are:
1 2 3
% lucky
Your lucky numbers are:
7 14 21
% lucky 1 2 3
Your lucky numbers are:
1 2 3
이렇게 ArgumentParser를 사용하면 커맨드 라인 인터페이스를 훨씬 쉽게 만들 수 있어요. 속성 래퍼로 인자, 옵션, 플래그를 선언하고, 기본값을 제공하면 명령어 동작을 간단하게 정의할 수 있답니다. 코드를 작성하면서 예제를 직접 실행해 보는 것도 좋겠죠? 그럼 명령어를 더 풍부하게 만들어 볼까요?










