---
# System prepended metadata

title: ' Embrace Swift Type Inference'

---


#### 오늘의 핵심 주제

>1. 타입 추론을 할 수 있는 경우
>2. 컴파일러에서 타입 추론이 작동하는 방식
>3. 코드의 컴파일러 오류를 이해하고 수정하는 방법



#### 타입 추론이란?


```swift
let x = "hi"
```

타입을 지정하지 않아도 할당된 값을 보고 x의 타입을 문자열로 유추할 수 있는 것


#### 스유에서 잘 쓰인다

SwiftUI 앱은 타입 추론에 크게 의존한다.
그 이유는 SwiftUI는 굉장히 많은 타입이 중첩되기 때문에 이때 추론이 없으면 코드가 너무 복잡해진다.

![](https://hackmd.io/_uploads/Skv4y_-d3.png)

위의 FilteredList 코드는 타입추론에 의존하고 있다. 

![](https://hackmd.io/_uploads/HyS-WdZ_3.png)

FilteredList 내부 코드를 보면 위와 같이 제너릭한 파라미터를 가지고 있다.
제너릭 타입은 컴파일러를 통해 유추할 수 있다.


<타입 생략>
![](https://hackmd.io/_uploads/SJTDMub_2.png)

<타입 명시>
![](https://hackmd.io/_uploads/r1J0W_Wu3.png)

위에 것이 더 깔끔해보인다. 타입 추론은 코드에서 이러한 모든 유형의 철자를 정확하게 알 필요가 없기 때문에 소스 코드를 더 빠르게 작성하는 데 도움이 된다.

#### 타입 추론이 작동하는 방식 

- 퍼즐을 푸는 것과 같다. → 명시적으로 주어진 정보들을 기반으로, 코드를 읽어서 빠진 부분을 채워넣는 것이다.
- 제네릭 인자를 주어진 인자들을 통해서 구체 타입으로 치환해 나간다.
    
 ![](https://hackmd.io/_uploads/B1gq4dbu3.png)

1. Element 자리를 Smoothie 타입으로 변경해준다.
2. Smoothie.title이 문자열이므로 FilterKey도 String으로 변경해줄 수 있다.
3. 이런식으로 퍼즐을 맞춰나가는 것임

#### 오류 찾는 방법

- 타입 추론 중에 컴파일러는 발생하는 모든 오류에 대한 정보를 기록한다.
- 그 다음 컴파일러는 타입 추론을 계속하기 위해 휴리스틱(알골이듬 인가봄)을 사용하여 오류를 수정한다. 
- 종종 소스 코드의 오류를 자동으로 수정하기 위한 실행 가능한 수정 사항 또는 오류를 유발할 수 있는 컴파일러가 유추한 구체적인 유형에 대한 메모를 포함한 모든 오류를 보고한다.


![](https://hackmd.io/_uploads/rycL_OWO2.png)


- 이렇게 스위프트 컴파일러는 추후에 에러 메시지를 출력할 때 사용하기 위해 에러 추적 기능을 타입 추론에 통합시켰다. 컴파일러는 타입 추론을 진행하면서 직면한 에러를 기록한다. 그리고 컴파일러는 에러를 고치고 타입 추론을 계속 진행하기 위해 휴리스틱을 사용한다.

- 그리고 타입 추론이 끝나면 컴파일러는 타입 추론을 진행하면서 수집한 에러를 에러 메시지(자동으로 코드를 수정할 수 있는)나 에러를 발생시킨 실제 타입에 대한 메시지와 함께 개발자에게 알린다.
