🔥 Swift Concurrency를 지원하는 ArgumentParser

214자
3분

ArgumentParser는 Swift Concurrency를 지원하며, 특히 async 버전인 run을 지원해요. async 버전인 run을 사용한다면, ParsableCommand 대신 AsyncParsableCommand를 준수해야 해요.

@main
struct FileUtility: AsyncParsableCommand {
    @Argument(
        help: "File to be parsed.",
        transform: URL.init(fileURLWithPath:)
    )
    var file: URL
 
    mutating func run() async throws {
        // FileHandle을 생성하여 파일을 읽을 준비를 해요.
        let handle = try FileHandle(forReadingFrom: file)
 
        // 파일의 각 라인을 비동기적으로 읽어요.
        for try await line in handle.bytes.lines {
            // 각 라인마다 원하는 작업을 수행해요.
        }
 
        // 파일 핸들을 닫아요.
        try handle.close()
    }
}
 
swift

이 코드에서는 AsyncParsableCommand를 채택하고 있어요. run() 메서드는 async throws로 선언하고 있죠. 이렇게 하면 run() 내부에서 await를 사용하여 비동기 작업을 수행할 수 있어요.

@Argument 속성을 사용하여 파싱할 파일 경로를 전달받아요. transform 클로저를 사용하여 파일 경로를 URL 타입으로 변환하죠.

run() 메서드 내부에서는 FileHandle을 생성하여 파일을 읽을 준비를 해요. 그리고 for try await 루프를 사용하여 파일 각 라인을 비동기적으로 읽어요. 이렇게 읽은 각 라인에 대해 원하는 작업을 수행할 수 있죠.

마지막으로 close() 메서드를 호출하여 파일 핸들을 닫아줘요.

주의!

실수로 ParsableCommandasync 버전인 run과 함께 사용한다면, 앱이 run 함수에 도달하지 않고 USAGE 텍스트만 표시할 수 있어요. async 버전인 run을 사용할 때는 반드시 AsyncParsableCommand를 사용해야 해요.

이렇게 ArgumentParser에서 Swift Concurrency를 활용하면 파일 읽기와 같은 비동기 작업을 깔끔하고 직관적으로 처리할 수 있습니다. 이를 통해 코드 가독성이 높아지고, 비동기 작업을 간편하게 다룰 수 있죠.