타입 별칭(typealias)은 기존 타입에 대한 별칭을 생성하는 메커니즘으로, 코드 가독성을 높이고 프로젝트 지원을 개선하며 추상화를 재사용할 수 있게 해줍니다.
질문 역사
타입 별칭은 다른 많은 언어, 예를 들어 C의 typedef와 같은 유산으로 등장했습니다. Swift에서 타입 별칭은 타입 시스템에 내장되어 있으며, 제네릭 타입과 associated type이 있는 프로토콜에 적극적으로 사용됩니다.
문제
대규모 프로젝트에서는 종종 긴 제네릭 타입, 복합 타입, 조합 및 중첩 타입이 발견됩니다. 별칭이 없으면 이러한 구성은 읽기 어려워지고 애플리케이션 지원을 복잡하게 만듭니다.
해결책
자주 사용되거나 복잡한 타입에 대한 타입 별칭을 선언하면 코드가 더 간단하고 이해하기 쉬우며 구조화됩니다. 또한 타입 별칭은 associatedtype이 있는 프로토콜에 대한 별칭을 지정하는 데 자주 사용되어 프로토콜을 타입으로 사용할 때의 제한을 우회할 수 있습니다.
코드 예:
typealias JSON = [String: Any] typealias CompletionHandler = (Result<Int, Error>) -> Void typealias StringDictionary = Dictionary<String, String> typealias Handler = (String) -> Void
핵심 특징:
타입 별칭으로 새 타입을 생성할 수 있나요?
아니요, 타입 별칭은 새 타입을 생성하지 않습니다. 이것은 단순한 별칭일 뿐이며, 기존 타입의 완전한 동의어이며, 컴파일러는 이를 동일한 타입으로 간주합니다.
typealias Age = Int let a: Age = 25 let b: Int = a // 모두 유효합니다.
타입 별칭은 타입 접근 수준(type safety)에서 작동하나요?
아니요, 타입 별칭은 잘못된 타입을 전달하는 것을 방지하지 않습니다: JSON과 [String: Any]는 서로 교환 가능합니다. 논리 제어 또는 분리를 위해서는 별도의 구조체/래퍼 객체를 사용해야 하며, 타입 별칭을 사용해서는 안 됩니다.
typealias UserID = Int typealias ProductID = Int func logId(_ id: UserID) {} let productId: ProductID = 42 logId(productId) // 컴파일러가 오류를 발생시키지 않습니다!
프로토콜 또는 제네릭 타입 내에서 타입 별칭을 선언할 수 있나요?
예, 프로토콜 내에서 종종 associatedtype이나 타입 별칭을 선언합니다, 특히 복잡한 제네릭 타입이나 사용자 정의 인터페이스의 경우.
protocol DataSource { associatedtype Item typealias CompletionBlock = (Item) -> Void }
모든 모델 식별자가 Int로 타입 별칭을 통해 선언되었습니다:
typealias UserID = Int typealias ProductID = Int func deleteUser(id: UserID) func deleteProduct(id: ProductID)
장점:
복잡한 제네릭 타입 또는 클로저의 결과에 대해 타입 별칭을 선언합니다:
typealias Completion<T> = (Result<T, Error>) -> Void let completion: Completion<String>
장점: