Swift는 강력한 타입 추론 메커니즘을 가지고 있습니다 — 이는 컴파일러가 프로그래머가 명시적으로 타입을 지정하지 않아도 값의 타입을 자동으로 결정할 수 있게 해줍니다. 타입 추론은 코드를 간결하게 만들고 "소음"을 줄여줍니다. 예를 들어:
let number = 42 // Int로 추론됨 let name = "John" // String으로 추론됨 let items = [1, 2, 3] // [Int]로 추론됨
하지만 몇 가지 주의사항을 기억해야 합니다:
let emptyArray = []를 선언하면 변수의 타입은 무엇일까요?
종종 emptyArray가 "무엇이든지"의 배열이거나 [Any]가 될 것이라고 대답합니다. 그러나 실제로 Swift 컴파일러는 타입을 추론할 수 없어서 오류를 발생시킵니다:
let emptyArray = [] // 오류: 빈 컬렉션 리터럴은 명시적 타입이 필요합니다
빈 배열을 사용하려면 타입을 명시적으로 지정해야 합니다:
let emptyArray: [Int] = []
이야기
팀은 let params = [:]로 빈 딕셔너리를 추가했으며, 타입이 [String: Any]가 될 것이라고 기대했습니다. 그러나 컴파일러가 타입을 추론할 수 없어 빌드가 실패했습니다. 결과적으로 type inference의 특성 때문에 원인을 알아내는 데 시간이 낭비되었습니다.
이야기
프로젝트에서 함수의 반환 타입이 let value = decode(json)으로 정의되었으며, 개발자는 [String: Any]을 예상하고 있었지만, 모호성 때문에 파서가 Any를 반환하여 런타임 시 타입 변환 오류로 애플리케이션이 다운되었습니다.
이야기
명시적 지정을 하지 않고 서로 다른 타입의 값을 배열에 추가하려고 시도했습니다 — let items = [1, "two", 3.0]. Swift는 타입을 [Any]로 추론했지만, 이는 후속 작업을 위해 동일한 타입의 요소 배열을 예상할 때 로직에서 오류를 초래했습니다.