본문 바로가기
Xcode/Swift - PlayGround

PlayGround) Closure 에 대해 알아보자 4부 (Enum&Gernics)

by 후르륵짭짭 2020. 8. 5.
728x90
반응형

안녕하세요 후르륵짭짭 입니다.

이번에는 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 통신 오류를 다루는 것을 다뤄봤습니다.

이해가 잘 됐을지는 모르겠지만 ㅎㅎㅎ

모두모두 즐코코 하세요!

728x90
반응형

댓글