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")
}
# 참고한 사이트
'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 |