-
Result TypeSwift/swift 문법 2023. 3. 27. 20:19
: 에러가 발생하는 경우 에러를 외부로 던지는 것이 아니라, 리턴 타입 자체를 Result Type으로 구현하여 함수 실행의 성공과 실패를 담아서 리턴
Result Type 사용 이유: try구문으로 에러 처리를 하기 힘듦 -> 타입 자체에 에러를 던질 수 있는 타입을 만들어준다.
Result Type
-> 열거형으로 구현
case success(Success)
case failure(Failure)
: 연관값을 반드시 필요로 한다.
func resultType(m: Int) -> Result<Bool, valueError> { if m > 5 { //throw 키워드가 아닌 return 키워드 이용 return Result.failure(valueError.maxError) //failure열거형 채택, 내부의 error중 maxError 채택 } } func resultType(m: Int) -> Result<Success, Failure> { // Bool, Error 타입, 정의된 Success, Failure에 실제 타입을 넣어서 쓴다. }
Failure 타입은 에러 프로토콜을 반드시 채택해야한다.
ex> Failure : Error
Bool, Error 타입, 정의된 Success, Failure에 실제 타입을 넣어서 쓴다.
Result Type 선언
func resultType(m: Int) -> Result<Bool, valueError> { if m > 5 { return Result.failure(valueError.maxError) } else { //연관 값에 Bool 타입을 넣어서 출력 return Result.success(ture) } } func resultType(m: Int) -> Result<Success, Failure> { // Bool, Error 타입, 정의된 Success, Failure에 실제 타입을 넣어서 쓴다. }
성공 시 Bool타입 반환
func resultType(m: Int) -> Result<Bool, valueError>
연관 값에 Bool 타입을 넣어서 출력
return Result.success(ture)
Result Type의 장점
error를 던질 필요가 없이 바로 변수에 할당 가능하다.
try 구문을 사용하지 않아도 된다.
결과 값 처리
// 리턴값 let result = resultType(m: 10) // 처리 switch result { case .success(let m): print("결과값: \(m)") case .failure(let error): print(error) }
네트워킹 코드에서 result type의 활용
: completion 함수에 파라미터를 2개 설정해 주는 대신, result type을 채택하여, 한개의 파라미터로 값을 출력할 수 있게 함.
func performRequest(with urlString: String, comletion: @escaping (Data?. NetworkError?) -> Void) { guard let url = URL(string: url) else { return } ... completion(Data,nil) }
정상적인 경우에는 safeData를 받는 completion의 타입
func performRequest(with urlString: String, comletion: @escaping (Result<Data. NetworkError>) -> Void) { guard let url = URL(string: url) else { return } ... //정상적인 경우에는 safeData를 받는 completion의 타입 completion(Result.success(safeData)) }
'Swift > swift 문법' 카테고리의 다른 글
제네릭 (0) 2023.03.27 에러 처리 (0) 2023.03.27 스위프트 : addSubView 위에 버튼 추가 (0) 2022.10.05 스위프트 : 익스텐션 extension (0) 2022.09.07 스위프트 - self (0) 2022.09.07