ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift Concurrency - Throwing & 비동기 Swift 프로퍼티
    Concurrency 2023. 3. 14. 08:47

    안녕하세요. 그린입니다🍏

    이번 포스팅에서는 프로퍼티에 대해 조금 다뤄볼 예정이에요.

    정확히는 Throwing 및 비동기 속성의 프로퍼티를 학습해보겠습니다🙋🏻

     

    Throwing 프로퍼티

    예시로 너무 익숙한 아래와 같은 Result 타입을 반환하는 throws 메서드가 있다고 생각해볼께요.

    func handleLoginResult(_ result: Result<User, Error>) throws {
        let user = try result.get()
        ...
    }

    여기서 get 메서드는 실제로 어떤 종류의 작업도 수행하지 않고 try 키워드를 사용해 Result 값을 만들 수 있기에 프로퍼티로 선언할 수 있어요.

     

    자 그럼 아래와 같이 만들 수 있겠죠?
    extension Result {
        var value: Success {
            get throws { try get() }
        }
    }

    value는 Success일때 값을 try하여 가져오는 프로퍼티입니다.

    이제 get 메서드를 직접 사용할 때와 마찬가지로 발생할 수 있는 에러를 처리한 새로운 값 프로퍼티에 액세스하는 것만으로 인스턴스에서 기본 값을 찾을 수 있습니다.

    func handleLoginResult(_ result: Result<User, Error>) throws {
        let user = try result.value
        ...
    }

    이제 이렇게 user 프로퍼티에 success하여 도출된 결과 값을 저장할 수 있습니다.

    위처럼 구현한다면 프로퍼티 측면에서는 의미가 더 있을 수 있지만 많은 throw 연산은 여전히 이전 함수로의 구현이 더 적절할 수 있습니다.

    즉, 각각의 상황 속에서 유용한 방법을 택하는것이 좋을거라 생각합니다🙌

     

    비동기 프로퍼티

    이제 Swift 5.5 이상 부터 연산 프로퍼티를 완전히 비동기화 할 수 있습니다.

    throws 키워드를 사용할 수 있는 방법과 유사하게 비동기 키워드가 포함된 프로퍼티는 이제 자유롭게 다른 비동기 API를 호출할 수 있으며 이러한 속성에 액세스하는 코드는 모든 기본 비동기 작업이 완료될 때까지 시스템에 의해 일시 중단됩니다.

    예시로, 아래와 같이 DatabaseEntity 클래스의 isSynced 프로퍼티에 액세스 할 때 마다 상위 DB와 비동기적으로 확인합니다.

    class DatabaseEntity {
        var isSynced: Bool {
            get async {
                await database?.isEntitySynced(self) ?? false
            }
        }
    
        private weak var database: Database?
        ...
    }

    비동기 코드의 경우에는 프로퍼티 기반 API 뒤에서 어떤 종류의 작업을 구현하는지에 주의해야합니다.

    예시로, 프로퍼티 계산의 일부로 네트워크 호출과 같이 비교적 오래 실행되는 작업을 수행하고 싶지 않을 수도 있지만, 별도의 디스패치 큐로 보내야하는 작업이나 파일 I/O 형식이 포함된 작업의 경우 비동기 속성이 유용할 수 있죠.

     

    프로토콜 요구사항

    마지막으로, 프로토콜의 일부로 선언될 때 이러한 새로운 효과적인 프로퍼티가 어떻게 보이는지 살펴보겠습니다.

    프로토콜이 표준 속성을 요구사항 목록의 일부로 정의할 수 있는 것처럼, 프로토콜은 이제 이러한 속성을 비동기적으로 요구할 수 있으며 선택적으로 throw할 수 있습니다.

     

    예시로 위 isSynced 프로퍼티를 프로토콜로 정의하면 아래와 같습니다.

    protocol Syncable {
        var isSynced: Bool { get async }
    }

     

    만약 오류를 발생하도록 하고싶다면 단순히 throws만 붙이면 되죠.

    protocol Syncable {
        var isSynced: Bool { get async throws }
    }

    다른 throw 프로토콜 요구사항과 마찬가지로 throws 표시된 속성의 구현은 실제로 throw 하지 않아도 되며 선택적으로 가능하게끔 주어집니다.

     

    결론

    여기까지 이번 학습에서는 Swift 5.5 부터 연산 프로퍼티를 throw 혹은 비동기 키워드로 표시하는 방법에 대해 알아봤습니다!

     

    마무리

    크게 많이 와닿은건 없고, 아~ 그렇구나 정도 학습을 했던 주제였습니다🥸

     

    [참고 자료]

    https://www.swiftbysundell.com/articles/throwing-async-properties/

     

    Throwing and asynchronous Swift properties | Swift by Sundell

    Swift 5.5 introduces a new concept called “effectful read-only properties”, which essentially means that computed properties can now utilize control flow mechanisms like errors and async operations when computing their values. Let’s start by taking a

    www.swiftbysundell.com

Designed by Tistory.