티스토리 뷰
Result Type
Swift5 부터 에러를 유연하게 처리할 수 있는 Result 문법에 대해 알아보고자 한다.
Result 타입은 Generic Enumeration 으로 선언 되어 있다.
@frozen enum Result<Success, Failure> where Failure : Error
기존의 문제점
API 통신에 대해 비동기 처리를 하였을때 다음과 같이 Queue,APIStatus 에 대한 데이터가 발생 할 수 있다.
- Queue : 데이터가 있는 경우 , APIStatus : 상태값이 존재하는 경우
- Queue: 데이터가 있는 경우 , APIStatus : nil
- Queue : nil , APIStatus : 상태값이 존재하는 경우
- 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
링크
TAG
- 로그
- nginx
- flask
- 네트워크
- ios
- spark
- logstash
- ElasticSearch
- linux
- SQL
- BigData
- python
- WEB
- 도커
- network
- MYSQL
- docker
- 리눅스
- 엘라스틱서치
- SWIFT
- pytest
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함