Rusult type 은 swift 5에서 지원하는 구조체로 Generic Enumeration으로 선언되어있다
보통 비동기 API 통신에서 결과를 가져오고 에러 처리를 하는 코드에서 가독성을 높이고 직관적인 코드를 작석하게 해주며 Alamofire와 같은 http 통신 라이브러리에서는 이미 직접 구현한 Result Type을 사용하고 있다 Success , Failure 2가지
보통 Result<T,error> 식으로 success 통신 결과를 객체에 매핑해서 전달해 주도록 사용하고 있지만 나의 경우에는 통신을 라이브러리에서 하기 때문에 통신의 결과를 Bool Type 으로 가져오고 에러의 경우 크게 3가지로 나누어서 사용하였다.
import Foundation
import UIKit
enum LoginError: String,Error{
case network = "네트워크 연결을 확인해주세요"
case macAddressFail = "MAC 주소오류 관리자에게 문의해 주세요"
case loginErrorinDRMServer = "DRM 서버 오류"
}
class LoginViewModel{
var msrAgent = MSRAgent()
//MARAgent 에서 로그인 결과 받아오기
func loginThread(id:String, pw:String, isSaveID:Bool ,complition: @escaping(Result<Bool,LoginError>)->Void ){
//네트워크 가능여부 확인
let isNetworkAvailable = Util.isNetworkEnable()
if !isNetworkAvailable{
complition(.failure(.network))
return
}
//MARAgent 에서 로그인 결과 받아오기
//서버에 로그인 요청 0이어야 성공
let iRet = LoginNetwork.login(id: id, pw: pw, idSave: isSaveID)
//멕어드레서값 읽을때 발생한 오류
if iRet == Constants.macAdressERROR{
complition(.failure(.macAddressFail))
}
else if iRet != 0 {
DispatchQueue.main.async { [weak self] in
guard let self = self else {return }
let msg = LoginNetwork.getErrorMessage(code: iRet)
Square.display("로그인 오류", "확인", message: self.msrAgent.msrAgentErrMsg(iRet))
}
complition(.failure(.loginErrorinDRMServer))
return
}
complition(.success(true))
}
}
사용법은
클로저로 리저트타입을 매게 변수로 전달해서 호출 부에서 결과값을 사용해 알람을 띄워주도록 구현함. Result<Bool,LoginError>