Swift/swift 문법
Result Type
Lyla.
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))
}