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