ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Result Type
    Swift/swift 문법 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))
    }

    'Swift > swift 문법' 카테고리의 다른 글

    제네릭  (0) 2023.03.27
    에러 처리  (0) 2023.03.27
    스위프트 : addSubView 위에 버튼 추가  (0) 2022.10.05
    스위프트 : 익스텐션 extension  (0) 2022.09.07
    스위프트 - self  (0) 2022.09.07
Designed by Tistory.