Swift는 코드의 안정성을 손상시키지 않고 간결한 구문을 달성하기 위해 타입 추론을 광범위하게 사용
컴파일러가 주변 컨텍스트에서 세부 정보를 파악할 수 있을 때 코드에서 명시적 타입 정보를 생략할 수 있다
let x = ""
타입이 명시되어 있지 않지만 컴파일러는 제공된 값을 기반으로 String으로 유추
let x: String = ""
let x = "" as String
SwiftUI 같이 코드가 타입 추론에 크게 의존할 때 더 흥미로움
SwiftUI는 작고 재사용 가능한 뷰
를 구성하여 크고 복잡한 인터페이스
를 생성
-> 재사용 가능한 구성 요소 호출에서 타입 추론의 크게 의존
예시 앱) 스무디를 주문하는 Fruta
💡 사용자가 스무디를 검색하는 기능을 추가하고 싶다
검색한 문자열로 스무디를 필터링하기 위해 String 타입의 State 프로퍼티 추가 - searchPhrase
FilterdList에 다음 두 가지 속성을 전달
➡️ 호출 사이트에서 타입 추론에 크게 의존
FilteredList는 범용 뷰이므로 클라이언트가 리스트에 표시해야 하는 모든 타입에서 작동해야 함
➡️ 제네릭으로 이러한 유연성이 제공됨
구체적 타입이라고 하는 실제 타입은 호출 사이트에서 지정되거나 컴파일러에 의해 유추됨
- Element : 데이터 배열 요소
- FilterKey : 데이터를 필터링할 Element의 특정 프로퍼티 타입
- RowContent : 표시할 뷰 타입
이 세 타입을 이니셜라이저의 매개변수로 사용할 수 있음
이니셜라이저의 매개 변수의 위치는 해당 타입이 대체해야하는 항목에 대한 단서를 컴파일러를 제공하여 호출 사이트에서 형식 유추에 대한 기회
FilteredList
- 매핑할 data로 초기화KeyPath<Element, FilterKey>
- 필터링 기준이되는 요소의 특성isInclude
- Filtered가 속성에서 저장해야 하므로 @escapingrowContent
- 데이터 요소를 뷰에 매핑하기 위한 @escaping 클로저, @ViewBuilder(SwiftUI DSL)SwiftUI DSL - Domain-Specific Language
: 특정 분야에서 가독성 및 사용성을 향상시킨 High-level 언어@ViewBuilder
: 클로저의 본문에 나열하여 여러 하위 뷰를 선언할 수 있으며 ViewBuilder는 상위 뷰가 작업> 할 수 있도록 하위 뷰를 튜플로 수집
[ 제네릭 구현부 / 호출 사이트 ]
타입 유추는 코드 작성 시 위와 같은 정확한 타입을 알 필요가 없어 작성 속도 빠름
컴파일러가 placeholder를 대세하는 대상을 파악하는 방법
Element ~~> Smoothie
FilterKey ~~> String
RowContent ~~> SmoothieRowView
가 됨소스 코드 단서에서 컴파일러가 퍼즐의 다른 부분과 맞지 않는 타입으로 추론할 수도 있음 -> 소스 코드의 오류
소스 코드에 오류가 있는 경우 타입 유추 전략을 수정하는 방법
(컴파일러가 FilterKey에 대한 타입 추론을 하던 상황)
KeyPath로 .title이 아닌 .isPopular 즉 Bool 값을 사용하는 실수를 하면 컴파일러는 잘못된 타입으로 유추하려고 시도
이후 모든 FilterKey를 Bool로 유추하다 Bool은 hasSubstring
메서드를 가지지 않기 때문에 컴파일러는 오류를 보고
컴파일러는 타입 추론 알고리즘에 오류 추적을 통합하여 이러한 실수를 포착하도록 설계됨
Xcode > 메뉴 > 동작 편집 > 빌드가 문제 탐색기를 표시하지 못하는 경우 동작 추가
=> 빌드에 실패할 때마다 프로젝트 전체의 오류를 볼 수 있음
option + 클릭 -> Quick Help 사용