안녕하세요 후르륵짭짭 입니다.
이번에는 Result<> 타입을 직접 구현 해보려 합니다.
1부 부터 3부 까지 Closure에 대해서 알아 봤고 Enum과 Gernics에 대해서 글을 쓴 적이 있습니다.
따라서 이것에 관련해서 API 통신 할 때 오류를 다루는 Result<>타입을 직접 만들어 보려 합니다.
그럼 시작 하겠습니다.
** 기본적인 셋팅 **
enum APIError : String{
case wifiError = "와이파이 에러"
case httpError = "통신 에러"
case justError = "그냥 에러 "
}
enum APIResult<SuccessType> {
case success(SuccessType)
case failure(APIError)
func PrintCase() -> Any {
switch self{
case .success(let message):
return message
case .failure(let message):
return message.rawValue
}
}
}
일단 API결과를 알려줄 APIResult ENUM을 생성해줍니다. 제너릭을 하나 생성 해주고 성공일 경우에 보내주도록 했습니다.
만약 실패일 경우에는 문자열을 RawValue 값을 가지는 APIError ENUM을 Value값으로 가질 수 있도록 했습니다.
(참고록 제너릭에 들어 갈 수 있는 값은 Class 아니면 Protocol 입니다. 그 외의 값은 가질 수 없습니다.)
그리고 현재 상태가 어떤지 알려주는 PrintCase() 함수를 ENUM 안에 만들었습니다.
** 생성한 Enum 테스트 **
struct Info{
let name : String
let id : Int
let major : String
func printFullInfo() -> String{
return "이름 : \(name) 학번 : \(id) 전공 : \(major)"
}
}
let student1 = Info(name: "ChapChap", id: 12345, major: "computer_Science")
let test = APIResult<String>.failure(.httpError)
let test2 = APIResult<Info>.success(student1)
if let result = test2.PrintCase() as? Info {
result.printFullInfo()
}
실험을 위해서 Struct를 하나 생성 해줍니다.
그런 다음 APIResult<성공시 데이터 타입>를 넣어줍니다. 그리고 성공일 경우에 보내줄 데이터를 넣어줍니다.
이때 PrintCase()는 반환 값이 Any 이기 때문에 타입케스팅으로 Info 구조체를 해줍니다
그렇고 성공일 경우에 Info 함수에 있는 printFullInfo()를 반환하도록 합니다.
** Closure을 이용한 에러 처리 **
func connection( status : Int , student : Info , escapingHandler : @escaping (APIResult<Info>) -> ()){
let goodStatus = 200..<300
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
print("Thread 시작 ")
if status == 300 {
escapingHandler(.failure(.wifiError))
return
}
if !goodStatus.contains(status) {
escapingHandler(.failure(.httpError))
return
}
if status == 250 {
escapingHandler(.failure(.justError))
return
}
escapingHandler(.success(student))
}
print("connection 함수 끝")
}
connection(status: 250, student: student1) { (result) in
if let studentInfo = result.PrintCase() as? Info{
print( studentInfo.printFullInfo() )
}
else{
print( result.PrintCase() )
}
}
이 코드를 보면 쉽게 알 수 있을 겁니다.
3부에서 Escaping Closure를 배웠기 때문에 어렵지 않게 이해 했을 거라 생각이 듭니다.
매개값으로 APIResult<INFO>를 보내줍니다.
그러면 EscapingHandler 함수에서 처리하게 되는 거죠 ㅎㅎㅎ
이 코드르 보여준 이유는 API 통신을 할 때 이렇게 흘러가기 때문입니다.
지금까지 API 통신 오류를 다루는 것을 다뤄봤습니다.
이해가 잘 됐을지는 모르겠지만 ㅎㅎㅎ
모두모두 즐코코 하세요!
'Xcode > Swift - PlayGround' 카테고리의 다른 글
PlayGround) Equatable에 대해서 알아보자 (0) | 2020.08.17 |
---|---|
PlayGround) Firebase 2부 (파싱&수정&삭제) (0) | 2020.08.09 |
PlayGround) FireBase 알아가기 1부 (설치&읽기&저장) (0) | 2020.08.05 |
PlayGround) Closure 에 대해서 알아보자 3부 (Escaping) (0) | 2020.08.04 |
PlayGround) Enum & Generics 에 대해서 알아보자! (0) | 2020.08.03 |
댓글