티스토리 뷰

IOS/swift

Result Type

내일도이렇게 2022. 3. 3. 18:36

Result Type 

Swift5 부터 에러를 유연하게 처리할 수 있는  Result 문법에 대해 알아보고자 한다. 

Result 타입은 Generic Enumeration 으로 선언 되어 있다.

@frozen enum Result<Success, Failure> where Failure : Error

기존의 문제점 

API 통신에 대해 비동기 처리를 하였을때  다음과 같이 Queue,APIStatus 에 대한 데이터가 발생 할 수 있다.  

 

  1. Queue : 데이터가 있는 경우 , APIStatus : 상태값이 존재하는 경우 
  2. Queue:  데이터가 있는 경우  , APIStatus : nil 
  3. Queue : nil , APIStatus : 상태값이 존재하는 경우 
  4. Queue : nil , APIStatus: nil 

 

함수에서 처리하고자 하는 상태는 성공과 실패에 대해서 명확하게 처리하고자 하는데 불필요한 상태에 대해 추가로 처리해야한다.  Result 타입을 사용하면 해결할 수 있다.

enum APIStatus : Error {
    .success,
    .failed,
    .noData,
    .invalidData
} 

func postOnqueue(completion: @escaping(Queue?,APIStatus?) -> Void ) {
        
         // ...
        
        dataRequest.responseData { response in
            switch response.result {
        
            case .success :
                
                guard let statusCode = response.response?.statusCode else {
                    completion(nil, .failed)
                    return
                }
                
                guard let value = response.value else {
                    completion(nil, .noData)
                    return
                }
                
                switch statusCode {     
                case 200 :
                    
                    let decoder = JSONDecoder()
                    
                    guard let queueData = try? decoder.decode(Queue.self, from: value)
                    else {
                        completion(nil, .invalidData)
                        return
                    }
                    completion(queueData, .success)
                   
                  // ... 
                }
                
            case .failure(let error) :
                completion(nil, .failed)
            }
        }
    }

Result 타입 적용 

Queue, APIStatus 에 대한 상태값들을 다음과 같이 명확하게 처리할 수 있다. 

 

성공시 : completion(.success(queue)) 

실패시 : completion(.failure(.failed))

 func postOnqueue(completion: @escaping(Result<Queue,APIStatus>) -> Void ) {
        // ... 
  
        dataRequest.responseData { response in
        
            switch response.result {
                
            case .success :
                
                guard let statusCode = response.response?.statusCode else {
                    completion(.failure(.failed))
                    return
                }
                
                guard let value = response.value else {
                    completion(.failure(.noData))
                    return
                }
                
                switch statusCode {
                    
                case 200 :
                    
                    let decoder = JSONDecoder()
                    
                    guard let queueData = try? decoder.decode(Queue.self, from: value)
                    else {
                         completion(.failure(.invalidData))
                        return
                    }
                    completion(.success(queueData))
                    //... 
                }
                
            case .failure(let error) :
                completion(.failure(.failed))
            }
        }     
    }

 


Reference 

https://velog.io/@un1945/Swift-Result-Type

https://onelife2live.tistory.com/1

https://jusung.github.io/Result-%ED%83%80%EC%9E%85/

 

'IOS > swift' 카테고리의 다른 글

[Swift] Optional  (0) 2022.03.22
[Swift] Codable  (0) 2022.03.22
Property wrapper (UserDefaults 적용)  (0) 2022.03.05
[Swift] lazy  (0) 2022.03.01
[Swift] class & struct  (0) 2022.02.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함