Apple-CS-interview / iOS-CS-interview

7 stars 1 forks source link

Result타입에 대해 설명하시오. #30

Open Do-hyun-Kim opened 1 year ago

Do-hyun-Kim commented 1 year ago

Result타입에 대해 설명하시오.

@frozen enum Result<Success, Failure> where Failure : Error

Result 타입을 사용한 에러 처리


enum NetworkError: Error {
    case invalidRequest
    case encodingError
    case decodingError
    case timeout
    case internalServerError
}

func serverNetwork(id: String) -> Result<Bool, NetworkError> {
    if id.count > 13 {
        return .failure(.invalidRequest)
    } else {
        return .success(true)
    }
}

print(serverNetwork(id: "ABCDEFGHIJKLMO"))

// Return ResultType
typealias ResultType = Result<Bool, NetworkError>

func networkAPI(password: String) -> ResultType {
    if password.count > 8 {
        return .success(true)
    } else {
        return .failure(.invalidRequest)
    }

}

print(networkAPI(password: "123456"))

// Escaping ResultType
typealias EscapingResultType = (Result<Bool, NetworkError>) -> Void

func fetchAPI(password: String, domain: @escaping EscapingResultType) {
    if !password.isEmpty {
        domain(.success(true))
    } else {
        domain(.failure(.invalidRequest))
    }
}

fetchAPI(password: "123456") { result in
    switch result {
    case let .success(data):
        print("FETCHAPI ISSTATUS : \(data)")
    case let .failure(error):
        print("FETCHAPI ERROR: \(error)")
    }
}

📝 참고 사이트

vichye-1 commented 1 year ago

Result 타입이란?

@frozen
enum Result<Success, Failure> where Failure : Error

출처

ronick-grammer commented 11 months ago

Result 타입이란

Result 타입은 Generic Enumeration로 선언되어 있으며 연관값을 포함하여, 성공(success)과 실패(failure)를 나타내는 타입이다.

@frozen enum Result<Success, Failure> where Failure : Error {
    case success(Success)
    case failure(Failure)
}

Result 타입을 사용하는 이유

기존에 에러를 처리하기 위해 throwdo-catch, completionHandler 을 사용하였으며, 이로 인해 성공과 실패에 대한 결과값을 아래처럼 제공하게 된다.

위와 같은 비유동적인 코드 작성과, 가독성의 개선을 위해 Result 타입을 사용한다. Result 타입은 아래의 두가지에 대한 결과값만 제공한다.

let task = URLSession.shared.dataTask(with: url) { result in
    switch result {
    case .success(let data):
        // Handle successful response data
        ...
    case .failure(let error):
        // Handle error
        ...
    }

📝 참고 사이트