iOS/Swift 상식

Result Type

HJ39 2023. 3. 25. 21:20

Result 타입은 Gerneric Enumeration으로 선언되어 있고 연관된 값의 성공과 실패를 나타낸다.

 

말만 들으면 뭔가 헷갈린다.

 

정의의 윗부분만 가져와 보았다.

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

    /// A success, storing a `Success` value.
    case success(Success)

    /// A failure, storing a `Failure` value.
    case failure(Failure)

enum 타입으로 구성되어 있고 각 case에 연관된 값을 표현한다

where 문법에 의해 failure의 경우에는 Error 타입만 입력받는다.

 

뭔지 잘 모를 땐?! 예시를 보면 이해를 쉽게 할 수 있다.

enum PersonError: Error{
    case invalidName
    case invalidAge
    case etc
}

enum PersonSuccess {
    case successName
    case successAge
    case etc
}

struct Person{
    var name: String
    var age: Int
}

let person = Person(name: "d", age: 5)

func checkPerson(person: Person) -> Result<PersonSuccess,PersonError>{
    if person.name == ""{
        return .failure(.invalidName)
    }
    if person.age < 1{
        return .failure(.invalidAge)
    }
    if person.name == "a"{
        return .success(.successName)
    }
    if person.age == 5{
        return .success(.successAge)
    }
    return .success(.etc)
}

let check = checkPerson(person: person)
switch check{
case .success(let data):
    print(data)
case .failure(let error):
    print(error)
}

enum 타입으로 PersonError은 Error타입으로 PersonSuccess은 성공 시 쓰기 위해 선언하였다.

Person객체를 확인하는 간단한 코드인데 이름이 빈칸이거나 나이가 1 이하인 경우 실패를 반환하게끔 하였다.

성공한 경우도 나누어 보기 위해 이름이 "a"인 경우와 나이가 5인 경우 특수하게 성공(?)하게 끔 하였다

 

Result Type이 등장하기 전에는 throw, try-catch를 사용하여 구현하였는데 Result Type과 비교하여 공부하면 좋을 것 같다.

func checkPerson(person: Person) throws {
    if person.name == ""{
        throw PersonError.invalidName
    }
    if person.age < 1{
        throw PersonError.invalidAge
    }

}

do{
    try checkPerson(person: person)
}catch PersonError.invalidName{
    print("invalidName")
}catch PersonError.invalidAge{
    print("invalidAge")
}

 

 

# 참고한 사이트

  1. https://velog.io/@un1945/Swift-Result-Type
  2. https://hryang.tistory.com/21

'iOS > Swift 상식' 카테고리의 다른 글

Optional Chaining과 nil-coalescing operator(??)의 차이점과 사용 시 주의사항은 무엇인가요?  (0) 2023.06.26
Codable  (0) 2023.06.26
Some  (0) 2023.03.25
property wrapper  (0) 2023.03.10
defer  (0) 2023.03.09