🔥 플래그 반전, 열거형, 카운트 사용하기

346자
4분

플래그는 보통 Bool 프로퍼티에 많이 사용해요. 플래그 반전을 지정하면 true/false 쌍으로 된 플래그를 만들 수 있습니다.

struct Example: ParsableCommand {
    @Flag(inversion: .prefixedNo)
    var index = true // 기본값을 true로 설정합니다.
 
    @Flag(inversion: .prefixedEnableDisable)
    var requiredElement: Bool // 기본값을 설정하지 않아 사용자가 꼭 지정해야 합니다.
 
    mutating func run() throws {
        print(index, requiredElement)
    }
}
 
swift

플래그를 반전으로 선언할 때는 프로퍼티 초기값을 true 또는 false로 설정하여 기본값을 정합니다. 사용자가 두 반전 중 하나를 꼭 고르게 하려면 기본값을 생략하면 돼요.

Example 명령에서 requiredElement 프로퍼티는 플래그가 필수로 지정되어 있어요. 지정된 접두사는 플래그의 긴 이름 앞에 붙습니다.

% example --enable-required-element
true true
% example --no-index --disable-required-element
false false
% example --index
Error: Missing one of: '--enable-required-element', '--disable-required-element'
 
shell

부울 값에 대해 사용자가 원하는 이름의 플래그를 만들거나, 두 개 이상의 이름 중에서 하나만 고를 수 있게 하거나, 정해진 선택 항목 집합에서 여러 값을 모으려면 EnumerableFlag 프로토콜을 따르는 열거형을 정의하세요.

enum CacheMethod: String, EnumerableFlag {
    case inMemoryCache
    case persistentCache
}
 
enum Color: String, EnumerableFlag {
    case pink, purple, silver
}
 
struct Example: ParsableCommand {
    @Flag var cacheMethod: CacheMethod // 캐시 방법을 고르는 플래그예요.
    @Flag var colors: [Color] = [] // 여러 색상을 고를 수 있는 플래그예요. 기본값은 빈 배열이에요.
 
    mutating func run() throws {
        print(cacheMethod)
        print(colors)
    }
}
 
swift

이 경우 플래그 이름은 원시 값에서 가져와요. 이름과 도움말 텍스트를 사용자가 원하는 대로 바꾸는 방법은 EnumerableFlag 문서를 보시면 자세히 나와 있어요.

% example --in-memory-cache --pink --silver
.inMemoryCache
[.pink, .silver]
% example
Error: Missing one of: '--in-memory-cache', '--persistent-cache'
 
shell

마지막으로, 플래그 타입이 Int면 해당 플래그가 지정된 횟수만큼 값으로 바뀝니다.

struct Example: ParsableCommand {
    @Flag(name: .shortAndLong)
    var verbose: Int // 상세 정보 출력 단계를 나타내는 정수 플래그예요. 기본값은 0이에요.
 
    mutating func run() throws {
        print("Verbosity level: \(verbose)")
    }
}
 
swift

이 예제에서 verbose는 기본값이 0이고, -v 또는 --verbose가 주어진 횟수를 세어요.

% example --verbose
Verbosity level: 1
% example -vvvv
Verbosity level: 4
 
shell

이렇게 Bool 프로퍼티에 플래그 반전을 사용하거나, EnumerableFlag 프로토콜을 따르는 열거형을 정의해서 사용자가 원하는 플래그 이름과 선택 항목을 제공하거나, Int 타입 플래그로 지정 횟수를 세는 방법으로 명령줄 인터페이스에서 여러 가지 옵션을 자유롭게 처리할 수 있습니다.