---
# System prepended metadata

title: Result Type in Swift

---

### Result type
- Result type은 swift standard library에 구현되어있는 ```열거형 데이터타입```이다. success와 failure 두 가지 경우로 나뉘어(switch와 잘 맞음) value를 저장한다.

```swift
@frozen enum Result<Success, Failure> where Failure : Error
```
공식 문서에 정의된 내용을 살펴보면, Failure는 ```Error 프로토콜```을 채택하고있어 ```do-catch문```과 유사하게 오류처리가 가능하다는 특징이 있다.
<br/>

**💭 예제를 활용한 이해**
```swift
enum ValueError: Error {
    case underFive
}

var resultArray: [Result<String, Error>] = []

func upTest() throws -> String {
    var randomInt = Int.random(in: 0...9)
    if randomInt >= 5 {
        return "up"
    } else {
        throw ValueError.underFive
    }
}

for _ in 0...9 {
    let sample = Result { try upTest() }
    resultArray.append(sample)
}

for count in 0...9 {
    switch resultArray[count] {
    case .success(let answer):
        print(answer)
    case .failure(let error):
        print(error)
    }
}

```

이해를 돕기 위해 예제 코드를 작성해봤다.
1. 오류 열거형 ValueError

2. resultArray에 Result타입을 element로 갖는 빈 Array를 할당해줌

3. upTest라는 오류를 던져주는 함수 작성 
-> 랜덤한 0~9 사이의 숫자를 뽑아 5이상일 경우 return "up" / 5미만일 경우 throw

4. 반복문을 통해 resultArray에 ```try upTest()```의 결과를 append
-> return "up"일 경우 sample은 success에 "up"을 저장.
-> throw ValueError.underFive의 경우 sample은 failure에 해당 오류 저장
-> 이후 sample이 Array element로 할당됨

5. resultArray의 element 각각에 접근하여 switch-case 구문으로 해당 element 값을 출력.
<br/>

랜덤으로 sample을 얻어냈기 때문에 실행할 때마다 같은 결과를 얻진 못했지만, Result의 활용법과 타입 자체 개념에 대해 이해하는데 도움이 되었다.

결과적으로 Result 타입은 failure에 Error를 value로 저장하고, success에 Error가 발생하지 않았을 때 얻어낸 값을 value로 저장하는 것으로 이해했다.
(저장된 값들은 switch문을 통해서 접근이 가능하다.)

특히 ```Result { try someFuction() }```의 형식으로 사용이 가능하다는 점이 신기했고, 이를 적용하니 숫자야구게임 코드의 가독성이 올라갔다고 생각한다.

참조 1. [Apple Developer Documentation - Result](https://developer.apple.com/documentation/swift/result)
참조 2. [Apple Developer Documentation - Preserving the Result of a throwing expression](https://developer.apple.com/documentation/swift/preserving-the-results-of-a-throwing-expression)