본문 바로가기

공부/iOS

Swift - typealias

안녕하세요. 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로 짧게 사용할 수 있다.

 

 

읽어주셔서 감사합니다. 틀린내용이 있다면 댓글 부탁드려요~