#### 오늘의 핵심 주제
>1. 타입 추론을 할 수 있는 경우
>2. 컴파일러에서 타입 추론이 작동하는 방식
>3. 코드의 컴파일러 오류를 이해하고 수정하는 방법
#### 타입 추론이란?
```swift
let x = "hi"
```
타입을 지정하지 않아도 할당된 값을 보고 x의 타입을 문자열로 유추할 수 있는 것
#### 스유에서 잘 쓰인다
SwiftUI 앱은 타입 추론에 크게 의존한다.
그 이유는 SwiftUI는 굉장히 많은 타입이 중첩되기 때문에 이때 추론이 없으면 코드가 너무 복잡해진다.

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

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

<타입 명시>

위에 것이 더 깔끔해보인다. 타입 추론은 코드에서 이러한 모든 유형의 철자를 정확하게 알 필요가 없기 때문에 소스 코드를 더 빠르게 작성하는 데 도움이 된다.
#### 타입 추론이 작동하는 방식
- 퍼즐을 푸는 것과 같다. → 명시적으로 주어진 정보들을 기반으로, 코드를 읽어서 빠진 부분을 채워넣는 것이다.
- 제네릭 인자를 주어진 인자들을 통해서 구체 타입으로 치환해 나간다.

1. Element 자리를 Smoothie 타입으로 변경해준다.
2. Smoothie.title이 문자열이므로 FilterKey도 String으로 변경해줄 수 있다.
3. 이런식으로 퍼즐을 맞춰나가는 것임
#### 오류 찾는 방법
- 타입 추론 중에 컴파일러는 발생하는 모든 오류에 대한 정보를 기록한다.
- 그 다음 컴파일러는 타입 추론을 계속하기 위해 휴리스틱(알골이듬 인가봄)을 사용하여 오류를 수정한다.
- 종종 소스 코드의 오류를 자동으로 수정하기 위한 실행 가능한 수정 사항 또는 오류를 유발할 수 있는 컴파일러가 유추한 구체적인 유형에 대한 메모를 포함한 모든 오류를 보고한다.

- 이렇게 스위프트 컴파일러는 추후에 에러 메시지를 출력할 때 사용하기 위해 에러 추적 기능을 타입 추론에 통합시켰다. 컴파일러는 타입 추론을 진행하면서 직면한 에러를 기록한다. 그리고 컴파일러는 에러를 고치고 타입 추론을 계속 진행하기 위해 휴리스틱을 사용한다.
- 그리고 타입 추론이 끝나면 컴파일러는 타입 추론을 진행하면서 수집한 에러를 에러 메시지(자동으로 코드를 수정할 수 있는)나 에러를 발생시킨 실제 타입에 대한 메시지와 함께 개발자에게 알린다.