개발하는 동글 :]

[TIL],[Swift],[Result 타입 파보기] 본문

카테고리 없음

[TIL],[Swift],[Result 타입 파보기]

동글하다 2023. 8. 23. 10:39

TIL

Result 타입의 내부

@frozen
public enum Result<Success, Failure: Error> {

  case success(Success)
  
  case failure(Failure)
  
  @inlinable
  public func map<NewSuccess>(
    _ transform: (Success) -> NewSuccess
  ) -> Result<NewSuccess, Failure> {
    switch self {
    case let .success(success):
      return .success(transform(success))
    case let .failure(failure):
      return .failure(failure)
    }
  }
  
  @inlinable
  public func mapError<NewFailure>(
    _ transform: (Failure) -> NewFailure
  ) -> Result<Success, NewFailure> {
    switch self {
    case let .success(success):
      return .success(success)
    case let .failure(failure):
      return .failure(transform(failure))
    }
  }
 
  @inlinable
  public func flatMap<NewSuccess>(
    _ transform: (Success) -> Result<NewSuccess, Failure>
  ) -> Result<NewSuccess, Failure> {
    switch self {
    case let .success(success):
      return transform(success)
    case let .failure(failure):
      return .failure(failure)
    }
  }
  
  @inlinable
  public func flatMapError<NewFailure>(
    _ transform: (Failure) -> Result<Success, NewFailure>
  ) -> Result<Success, NewFailure> {
    switch self {
    case let .success(success):
      return .success(success)
    case let .failure(failure):
      return transform(failure)
    }
  }
  
  @inlinable
  public func get() throws -> Success {
    switch self {
    case let .success(success):
      return success
    case let .failure(failure):
      throw failure
    }
  }
}

extension Result where Failure == Swift.Error {

  @_transparent
  public init(catching body: () throws -> Success) {
    do {
      self = .success(try body())
    } catch {
      self = .failure(error)
    }
  }
}

extension Result: Equatable where Success: Equatable, Failure: Equatable { }

extension Result: Hashable where Success: Hashable, Failure: Hashable { }

extension Result: Sendable where Success: Sendable { }

Reuslt?

  • Result는 열거형이며 제네릭으로 Succees의 타입과 Error타입을 가진다
  • 케이스는 success와 failure가 있으며 success는 인자로 받은 Success 타입을 failure은 Failure Error타입을 가지고 있다.

Reference

https://github.com/apple/swift/blob/main/stdlib/public/core/Result.swift