๐ŸŽ iOS & Swift

[iOS] Typealias, ํƒ€์ž… ๋ณ„์นญ ์‚ฌ์šฉํ•˜๊ธฐ

taeeekki 2021. 9. 2. 00:29

typealias๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž

 

ํ•ด๋‹น ๊ธ€์— ์‚ฌ์šฉ๋œ ์˜ˆ์‹œ๋Š” 2๊ฐ€์ง€ ๊ธ€์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
์ถœ์ฒ˜๋Š” ๊ธ€ ๋งˆ์ง€๋ง‰์— ์ ์–ด๋†“์•˜์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ํ•˜์…”์„œ ๊ธ€ ์ฝ์–ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :)

 

๐Ÿ’ฌ ๋“ค์–ด๊ฐ€๊ธฐ์ „์—

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๊ณ  ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. typealias๋Š” ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ฐ€๋…์„ฑ์žˆ๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์–ธ์ œ ์‚ฌ์šฉํ•˜๋ƒ๊ตฌ์š”? ์ •๋‹ต์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์žˆ์ฃ .

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ทธ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ํ•จ๊ป˜ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ—’ typealias๋ž€

typealias๋ž€ ํƒ€์ž…์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ๋ณ„์นญ, ์•ฝ์นญ์ž…๋‹ˆ๋‹ค.
typealias (์‚ฌ์šฉํ•  ๋ณ„๋ช…) = (์กด์žฌํ•˜๋Š” ํƒ€์ž…)
ex) typealias Nickname = Int
ex) typealias Codable = Decodable & Encodable
ex) ...

 

typealias๋Š” ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ธฐ์กด ์œ ํ˜•์„ ์ƒˆ๋กœ์šด ์ด๋ฆ„์œผ๋กœ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๊ฒŒ๋งŒ ๋งŒ๋“ ๊ฑฐ์ฃ .

๋ฆฌ๋ˆ…์Šค์—์„œ Alias(๋ณ„์นญ)๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์…จ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ์™€ ๋‹ฟ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฒฝํ—˜์ด ์—†์–ด๋„ ๊ดœ์ฐฎ์•„์š”. ์œ„์— ์žˆ๋Š” ์„ค๋ช…์ด ๋‹ค ์ด๋‹ˆ๊นŒ์š”.

 

๐Ÿง ์–ธ์ œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

์‚ฌ์šฉ ์˜ˆ์‹œ 1) ํ”„๋กœํ† ์ฝœ์˜ ๊ฒฐํ•ฉ

ํ”„๋กœํ† ์ฝœ์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Codable ์—ญ์‹œ Decodable๊ณผ Encodable์˜ ๊ฒฐํ•ฉ์ฒด์ž…๋‹ˆ๋‹ค.

struct DataModel: Codable {
	var name: String
	var description: String
}
public typealias Codable = Decodable & Encodable

 

์ €๋Š” ๊ฐ€๋”์”ฉ ์ด๋ ‡๊ฒŒ๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. TableView๋‚˜ CollectionView์™€ ๊ด€๋ จ๋œ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ์ฃ . ํ•œ ๋ฒˆ์— ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ํŽธํ•œ ์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑฐ๋Š” ๊ทธ๋ƒฅ ์ทจํ–ฅ ์ฐจ์ด์ผ ๊ฒƒ ๊ฐ™์•„์š”.

public typealias CollectionViewDelegate = UICollectionViewDataSource & UICollectionViewDelegate & UICollectionViewDelegateFlowLayout

extension ViewController: CollectionViewDelegate {
	// ๋ฉ”์„œ๋“œ ์ƒ๋žต
}

 

 

์‚ฌ์šฉ ์˜ˆ์‹œ 2) ๊ธฐ๋ณธ ์œ ํ˜•์— ์˜๋ฏธ ์ถ”๊ฐ€

๋ชจ๋“  ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ์œ ํ˜•, ๊ธฐ๋ณธ ์œ ํ˜•(Primitive Types)์— ๋ณ„์นญ์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

typealias๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•ด์ฃผ๋ฉด ๋ฌธ๋งฅ์— ๋Œ€ํ•œ ๋ช…ํ™•์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func heatProduced() -> Double {
	return 0
}
typealias Jules = Double
func heatProduced() -> Jules {
	return 0
}

 

 

์‚ฌ์šฉ ์˜ˆ์‹œ 3) ์ œ๋„ค๋ฆญ ์œ ํ˜•์— ์‚ฌ์šฉ

// typealias๋กœ ๋งŒ๋“  Array์ธ EventList๋ผ๋Š” ์นœ๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
// ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ œ๋„ค๋ฆญ ์œ ํ˜•์„ ๋ฐ›๊ณ  ์žˆ๋„ค์š”.
typealias EventList<T> = Array<T>

let array:EventList = EventList(arrayLiteral: 1,2,3)
typealias EventList<T> = Array<T> where T:StringProtocol

์ œ๋„ค๋ฆญ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ œ์•ฝ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ๊ณผ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ์ œ์•ฝ์กฐ๊ฑด์— ๋Œ€ํ•ด์„œ ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š์œผ์‹œ๋‹ค๋ฉด ๋จผ์ € ํ•™์Šต์„ ํ•˜๊ณ  ์˜ค์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

์„œ๋ธŒํด๋ž˜์‹ฑ์—†์ด ์ปค์Šคํ…€ ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ์ •์˜ํ•˜๋Š”๋ฐ์— ์œ ์šฉํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

(๊ทผ๋ฐ ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ์ผ๊นŒ์š”...? ์™œ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฑฐ์ง€...? ์ด๊ฑด ํ•œ ๋ฒˆ ์ฐพ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค...)

 

 

 

์‚ฌ์šฉ ์˜ˆ์‹œ 4) ํด๋กœ์ €์— ์‚ฌ์šฉ

๋‹ค์Œ์€ ์„ธ ๊ฐ€์ง€์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํด๋กœ์ €๋ฅผ ๋ฐ›๊ณ  ์žˆ๋„ค์š”. ๋งŒ์•ฝ ๋” ๋งŽ์€ ํด๋กœ์ €๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค๋ฉด ๋ˆˆ๋„ ์•„ํ”„๊ณ  ๊ฑฐ์Šฌ๋ฆฌ๊ฒ ์ฃ ? typealias๋ฅผ ์ด์šฉํ•ด์„œ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

func upload(success: ((Int) -> Int)?, failure: ((Error) -> Void)?, progress: ((Double) -> Void)?) {
}
typealias Success = (Int) -> Int
typealias Failure = (Error) -> Void
typealias Progress = (Double) -> Void

func upload(success: Success?, failure: Failure?, progress: Progress?) {
}

 

์ด๋Ÿฌํ•œ ํ˜•ํƒœ๋Š” ํŠนํžˆ ์„œ๋ฒ„ ํ†ต์‹ ์ฝ”๋“œ์—์„œ๋„ ์ •๋ง ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ตœ๊ทผ์— ์ •๋ฆฌํ•œ ์„œ๋ฒ„ ํ†ต์‹ ์ฝ”๋“œ์ธ๋ฐ์š”. ์•„๋ž˜์—์„œ ์„ฑ๊ณต๊ณผ ์‹คํŒจ์— ๊ด€๋ จ๋œ ํด๋กœ์ €๋ฅผ typealias๋ฅผ ์ด์šฉํ•ด์„œ ๊น”๋”ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ดํ•ดํ•˜๊ณ  ๋ณด๋‹ˆ๊นŒ ๋ฟŒ๋“ฏํ•˜๋„ค์š” ๐Ÿ˜‹)

import Foundation

import Alamofire

class APIClient {
    
    typealias onSuccess<T> = ((T) -> Void)
    typealias onFailure = ((_ error: Error) -> Void)
    
    static func request<T>(_ object: T.Type,
                                  router: APIRouter,
                                  success: @escaping onSuccess<T>,
                                  failure: @escaping onFailure) where T: Decodable {
        AF.request(router)
            .validate(statusCode: 200..<500)
            .responseDecodable(of: object) { response in
                switch response.result {
                case .success:
                    guard let decodedData = response.value else { return }
                    success(decodedData)
                case .failure(let err):
                    failure(err)
                }
        }
    }
    
}

 

 

์‚ฌ์šฉ ์˜ˆ์‹œ 5) ํ”„๋กœํ† ์ฝœ์˜ ๊ด€๋ จ ํƒ€์ž…(AssociatedType)

ํ”„๋กœํ† ์ฝœ์˜ associated type๋„ typealias์˜ ์ด์ ์„ ๊ฐ–๋Š”๋‹ค๊ณ  ํ•˜๋„ค์š”. ์ด ๋…€์„์€ ๋จผ์ € associated type์„ ์ดํ•ดํ•˜๊ณ  ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

protocol Example {
	associatedtype load: StringProtocol
}

struct Implement: Example {
	typealias load = String
}

 

 

์‚ฌ์šฉ ์˜ˆ์‹œ 6) ํ”„๋กœํ† ์ฝœ ์„ ์–ธ ์‹œ

ํ•ด๋‹น ์˜ˆ์‹œ๋Š” brody๋‹˜์˜ ๋ธ”๋กœ๊ทธ ์˜ˆ์‹œ๋ฅผ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์˜ˆ์‹œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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๋กœ ์งง๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐ŸŽซ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์‚ฌ์‹ค์ƒ ์ฝ”๋“œ ์–ด๋А ๋ถ€๋ถ„์— typealias๋ฅผ ์‚ฌ์šฉํ• ์ง€๋Š” ๊ฐœ๋ฐœ์ž์˜ ๋ชซ์ด์ฃ . ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ์‚ฌ์šฉํ•ด์•ผ ๊ฐ€๋…์„ฑ์ด ์˜ฌ๋ผ๊ฐ€๊ณ  ์ข€ ๋” ๊น”๋”ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ ์ง€๋Š” ์Šค์Šค๋กœ ๊ณ ๋ฏผํ•ด๋ด์•ผํ•  ๋ถ€๋ถ„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ข‹๋‹ค๊ณ  ๋‚จ๋ฐœํ•ด์„œ๋„ ๊ทธ๋ ‡๋‹ค๊ณ  ์•„์˜ˆ ์‚ฌ์šฉ์„ ์•ˆํ•˜๊ธฐ๋„ ์ข€ ์• ๋งคํ•˜๋„ค์š”.

 

์ง€๊ธˆ ๋А๊ผˆ์„๋•Œ๋Š” ํด๋กœ์ €, ํŠนํžˆ ์„œ๋ฒ„ ํ†ต์‹  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ์•„์ง ๊ฐ์ด ์ž˜ ์•ˆ์˜ค๋„ค์š”. ๐Ÿ˜ฅ ์ข€ ๋” ๋ถ„๋ฐœํ•ด์„œ ์ด๋ฆฌ์ €๋ฆฌ ์ ์šฉํ•ด๋ณด๊ณ  ๋งŽ์ด ์ฐธ๊ณ ํ•˜๋ฉด์„œ ์ ์šฉํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ—‚ ๋ ˆํผ๋Ÿฐ์Šค