-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Result 타입을 사용하는 이유와 장점은 무엇인가요? #55
Comments
기다리는중이에요. 궁금하네요. 이유랑 장점이 뭔가요?? |
빨리좀 작성해주세요 궁금해요 |
아직 기다리고 있는데...... |
Result 타입을 사용하는 이유와 장점은 무엇인가요?Result 타입에 대해 설명하기 전에, 에러 처리 과정에 대해 먼저 살펴보자. 에러 처리 과정첫번째, 어떠한 에러가 발생할 것인지를 정의한다. enum HeightError: Error { // Error 프로토콜 채택
case maxHeight
case minHeight
}
두번째, throwing 함수 구현 func checkingHeight(height: Int) throws -> Bool {
if height > 190 {
throw HeightError.maxHeight
} else if height < 130 {
throw HeightError.minHeight
} else {
if height >= 160 {
return true
} else {
return false
}
}
}
세번째, 에러 처리 do {
let _ = try checkingHeight(height: 200)
print("놀이기구 탑승 가능")
} catch {
print("놀이기구 탑승 불가")
}
// 놀이기구 탑승 불가
Result
@frozen
enum Result<Success, Failure> where Failure : Error
제네릭 열거형 Result 타입을 사용하여 에러를 처리해보자
두번째, Result 리턴 함수 구현 func resultTypeCheckingHeight(height: Int) -> Result<Bool, HeightError> {
if height > 190 {
return Result.failure(HeightError.maxHeight)
} else if height < 130 {
return Result.failure(HeightError.minHeight)
} else {
if height >= 160 {
return Result.success(true)
} else {
return Result.success(false)
}
}
}
세번째, 에러 처리 let result = resultTypeCheckingHeight(height: 200)
// 처리
switch result {
case .success(let data): // 연관값을 바인딩
print("결과값은 \(data)입니다.")
case .failure(let error):
print(error)
}
Result 타입을 사용하는 이유
기존의 에러 처리는 단순히 데이터나 오류 메세지로만 구성이 되어 있다. 그에 반해 Result 타입은 함수 정의 시 에러 타입을 명시함으로써 하지만 예제를 더 보고 싶다면네트워킹 코드에서 Result 타입 사용
1. 튜플 타입을 활용한 데이터 전달 // 튜플타입을 활용
func performRequest(with url: String, completion: @escaping (Data?, NetworkError?) -> Void) {
guard let url = URL(string: url) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
// 에러 발생
if error != nil {
print(error!) // 에러가 발생했음을 출력
completion(nil, .someError) // 에러가 발생했으니, nil 전달
return
}
// 옵셔널 바인딩 실패
guard let safeData = data else {
completion(nil, .someError) // 안전하게 옵셔널 바인딩을 하지 못했으니, 데이터는 nil 전달
return
}
// 성공
completion(safeData, nil) // safe 데이터 전달
}.resume()
}
performRequest(with: "주소") { data, error in
// 데이터를 받아서 처리
if error != nil {
print(error!)
}
// 데이터 처리 관련 코드
}
2. Result 타입을 이용한 데이터 전달 // Result 타입 활용
func performRequest2(with urlString: String, completion: @escaping (Result<Data,NetworkError>) -> Void) {
guard let url = URL(string: urlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
// 에러 발생
if error != nil {
print(error!) // 에러가 발생했음을 출력
completion(.failure(.someError)) // 실패 케이스 전달
return
}
// 옵셔널 바인딩 실패
guard let safeData = data else {
completion(.failure(.someError)) // 실패 케이스 전달
return
}
// 성공
completion(.success(safeData)) // 성공 케이스 전달
}.resume()
}
performRequest2(with: "주소") { result in
switch result {
case .failure(let error):
print(error)
case .success(let data):
// 데이터 처리 관련 코드
break
}
}
이건 솔직히 안 쓸 거 같은데 일단 적어봤다.Result 타입의 활용get() 메서드
do {
let data = try result.get()
print("결과값은 \(data)입니다.")
} catch {
print(error)
} 정리
|
No description provided.
The text was updated successfully, but these errors were encountered: