🔥 Swift Concurrency를 지원하는 ArgumentParser
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()
메서드를 호출하여 파일 핸들을 닫아줘요.
주의!
실수로 ParsableCommand
를 async
버전인 run
과 함께 사용한다면, 앱이 run
함수에 도달하지 않고 USAGE
텍스트만 표시할 수 있어요. async
버전인 run
을 사용할 때는 반드시 AsyncParsableCommand
를 사용해야 해요.
이렇게 ArgumentParser에서 Swift Concurrency를 활용하면 파일 읽기와 같은 비동기 작업을 깔끔하고 직관적으로 처리할 수 있습니다. 이를 통해 코드 가독성이 높아지고, 비동기 작업을 간편하게 다룰 수 있죠.