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))
}