ํด๋น ๊ธ์ ์ฌ์ฉ๋ ์์๋ 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๋ฅผ ์ฌ์ฉํ ์ง๋ ๊ฐ๋ฐ์์ ๋ชซ์ด์ฃ . ์ด๋ค ๋ถ๋ถ์์ ์ฌ์ฉํด์ผ ๊ฐ๋ ์ฑ์ด ์ฌ๋ผ๊ฐ๊ณ ์ข ๋ ๊น๋ํ ์ฝ๋๊ฐ ๋ ์ง๋ ์ค์ค๋ก ๊ณ ๋ฏผํด๋ด์ผํ ๋ถ๋ถ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ข๋ค๊ณ ๋จ๋ฐํด์๋ ๊ทธ๋ ๋ค๊ณ ์์ ์ฌ์ฉ์ ์ํ๊ธฐ๋ ์ข ์ ๋งคํ๋ค์.
์ง๊ธ ๋๊ผ์๋๋ ํด๋ก์ , ํนํ ์๋ฒ ํต์ ์ฝ๋๋ฅผ ์์ฑํ ๋์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋จธ์ง๋ ์์ง ๊ฐ์ด ์ ์์ค๋ค์. ๐ฅ ์ข ๋ ๋ถ๋ฐํด์ ์ด๋ฆฌ์ ๋ฆฌ ์ ์ฉํด๋ณด๊ณ ๋ง์ด ์ฐธ๊ณ ํ๋ฉด์ ์ ์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ ๋ ํผ๋ฐ์ค
'๐ iOS & Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Delegate Pattern(๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด) ์์(1) - ์ด์ ํ๋ฉด์ผ๋ก ๋์ด์ค๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ์ถ์ ๋ (4) | 2021.09.09 |
---|---|
[iOS] Associated Type (3) | 2021.09.05 |
[iOS] ํ ์คํธ์ ํฌํจ๋์ด ์๋ HTMLํ๊ทธ ์ ๊ฑฐํ๊ธฐ (0) | 2021.08.28 |
[iOS] Convenience init(ํธ์ ์ด๋์ ๋ผ์ด์ ) (2) | 2021.08.22 |
[iOS] frame๊ณผ bounds (0) | 2021.08.20 |