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