🔥 소개

396자
4분

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를 사용하면 커맨드 라인 인터페이스를 훨씬 쉽게 만들 수 있어요. 속성 래퍼로 인자, 옵션, 플래그를 선언하고, 기본값을 제공하면 명령어 동작을 간단하게 정의할 수 있답니다. 코드를 작성하면서 예제를 직접 실행해 보는 것도 좋겠죠? 그럼 명령어를 더 풍부하게 만들어 볼까요?