안녕하세요. brody입니다.
Swift에서 사용하는 typealias에 대한 내용을 정리했어요.
저는 type alias의 뜻을 하나씩 번역하면 '타입 별명'으로 타입에 별명을 붙여서 쉽게 사용한다~
라고만 쉽게 간단히 사용했는데 찾아보니 제가 생각하는 것보다 사용할 수 있는 게 많네요!
docs.swift.org/swift-book/ReferenceManual/Declarations.html
www.programiz.com/swift-programming/typealias
위의 링크를 번역하고 제 나름대로 해석한 내용이여서 틀린 내용이 있을 수 있습니다. (있다면 댓글 부탁드려요;;)
그럼 시작할게요!
'type alias declaration'는 프로그램에 존재하는 타입을 별명으로 하는 것이다.
'type alias declaration'는 typealias라는 키워드를 사용하여 선언한다.
typealias name(붙여줄 별명) = existing type (존재하는 타입)
위의 방법처럼 선언하여 사용할 수 있다.
typealias로 선언한 후에는 선언한 이름(별명)으로 프로그램의 모든 곳에서 사용할 수 있다.
알아야 할것은 typealias는 새로운 타입을 만드는 것이 아니라 단순히 별명이 기존 유형을 참조하도록 허용한 것이다.
typealias의 주요 목적은 코드를 이해하기 쉽도록 하고, 명확하게 만드는 것이다.
크게 3가지 타입으로 사용할 수 있는데 Swift 5.0 문서에서는 제네릭 파라미터와 프로토콜 선언 시에도 사용할 수 있다고 한다.
그럼 한개씩 알아볼게요~
1. Built-in type(String, Int)
String, Int, Float 등의 모든 내장 데이터 유형에 대해 typealias로 사용할 수 있다.
typealias MyName = String
위의 선언을 통해 MyName을 String 대신 모든 곳에서 사용할 수 있다.
다른 곳에서 사용하는 방법은 아래와 같다
var name: MyName = "brody"
var name2: String = "brody"
name, name2는 같은 String 타입이다.
2. user defiend types
프로그래밍을 하면서 자신만의 데이터 유형을 만드는 많은 경우가 있다.
이때 유저가 정의한 class, struct, enum에 typealias를 사용할 수 있다.
class Employee{
}
var employees1: Array<Employee> = []
typealias Employees = Array<Employee>
var employees2: Employees = []
3. complex types
클로저를 입력 매개변수로 사용할 때 typealias를 사용하여 깔끔하게 만들 수 있다.
//입력으로 클로저를 사용한다. 클로저는 Int값을 가져와서 String을 반환한다.
func someMethod(oncomp: (Int) -> (String)){
}
// (Int) -> (String) 클로저의 input과 return값을 typealias로 별명을 만들어 준다.
typealias CompletionHandler = (Int) -> (String)
// 이제 아래처럼 보기 편하게 사용할 수 있다.
func someMothod(oncomp: CompletionHandler){
}
4. generic parameters
제네릭 파라미터를 사용하여 기존 제네릭 타입에 이름을 부여할 수 있다.
기존에 존재하는 제네릭 파라미터의 타입 전체나 몇 개의 타입을 공급할 수 있다.
typealias StringDictionary<Value> = Dictionary<String, Value>
typealias StringDictionary2<Value> = [String : Value]
var dictionary1: StringDictionary<Int> = [:]
var dictionary2: Dictionary<String, Int> = [:]
//위의 dictionary1 와 dictionary2는 같은 타입이다.
//generic parameters로 선언할 때에는 정확한 타입을 넣어야 한다.
typealias DictionaryOfInts<Key: Hashable> = Dictionary<Key, Int>
//typealias 와 정확한 타입은 서로 바꾸어 사용할 수 있으며 typealias는 추가적인 일반적인 제약을 도입할 수 없다.
//또한 typealias는 정확한 타입의 generic parameters는 생략할 수 있다.
typealias Diccionario = Dictionary
// Diccionario typealias는 Dictionary와 동일한 일반 매개변수 와 제약 조건을 갖는다
5. 프로토콜 선언 시
프로토콜 선언에서 typealias는 자주 사용되는 형식에 더 짧고 편리한 이름을 제공할 수 있다.
protocol Sequence {
associatedtype Iterator: IteratorProtocol
typealias Element = Iterator.Element
}
func sum<T: Sequence>(_ sequence: T) -> Int where T.Element == Int {
// ...
}
// typealias가 없었다면 T.Iterator.Element로 사용해야 하지만 typealias로 T.Element로 짧게 사용할 수 있다.
읽어주셔서 감사합니다. 틀린내용이 있다면 댓글 부탁드려요~
'공부 > iOS' 카테고리의 다른 글
Objective-C typedef에 대해서 (0) | 2020.06.09 |
---|---|
iOS 계층구조 (0) | 2020.06.04 |
[Obj-C] @class(Forward declarations)에 대해서... (0) | 2020.04.29 |
UISplitViewContrller(1) - 기초, displayMode, master의 width조절 (0) | 2020.03.26 |
[오류] Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug (0) | 2020.02.05 |