같은 내용의 struct를 새로 만드는 대신 다른 이름의 struct를 하나 만드는 것 입니다

 

사용해야되는 상황

넷플릭스같은 앱을 만든다고 했을 때 영화 모델이 필요할 것입니다.

struct MovieModel {
    let title: String
    let director: String
    let count: Int
}
struct ContentView: View {
    
    @State var item: MovieModel = MovieModel(title: "Title", director: "Yoon", count: 5)

    var body: some View {
        VStack {
            Text(item.title)
            Text(item.director)
            Text("\(item.count)")
        }
    }
}

이후 tv 프로그램을 만든다고 했을 때 해당 프로그램도 영화 모델을 똑같이 사용할 것입니다.

struct TVModel {
    let title: String
    let director: String
    let count: Int
}
struct ContentView: View {
    
    @State var item: TVModel = TVModel(title: "TV Title", director: "KIM", count: 10)

    var body: some View {
        VStack {
            Text(item.title)
            Text(item.director)
            Text("\(item.count)")
        }
    }
}

 

typealias 사용하지 않았을 때 문제점

위에서 확인되는 것은 분명 title, director, count 전부 중복됩니다. 그러므로 구조체는 완전 같지만 이 중복되는 코드를 그대로 사용하게 되면 아래처럼 간결한 코드를 만들지 못하게 됩니다.

struct MovieModel {
    let title: String
    let director: String
    let count: Int
}

struct TVModel {
    let title: String
    let director: String
    let count: Int
}


struct ContentView: View {
    
    @State var item: MovieModel = MovieModel(title: "Title", director: "Yoon", count: 5)
    @State var item: TVModel = TVModel(title: "TV Title", director: "KIM", count: 10)
    
    var body: some View {
        VStack {
            Text(item.title)
            Text(item.director)
            Text("\(item.count)")
        }
    }
}

 

typealias 사용 후

만약 typealias 를 사용하여 코드를 만들게 된다면 다음과 같이 TVModel 를 직접 구현하는 일이 사라집니다. typealias 는 아래와 같이 같은 구조의 구조체를 새로 만드는 대신 같은 구조인 다른 이름의 구조체를 하나 만드는 것 입니다.

struct MovieModel {
    let title: String
    let director: String
    let count: Int
}

typealias TVModel = MovieModel

struct ContentView: View {
    
    @State var item: TVModel = TVModel(title: "TV Title", director: "KIM", count: 10)
    
    var body: some View {
        VStack {
            Text(item.title)
            Text(item.director)
            Text("\(item.count)")
        }
    }
}

 

typealias을 이용한 completionHandler: @escaping

func downloadData(completionHandler: @escaping DownloadCompletion) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        let result = DownloadResult(data: "New Data!")
        completionHandler(result)
    }
}

struct DownloadResult {
    let data: String
}

typealias DownloadCompletion = (DownloadResult) -> ()

 

'SwiftUI' 카테고리의 다른 글

Timer 타이머  (0) 2024.04.08
JSON Data  (0) 2024.04.08
Weak Self  (0) 2024.04.07
CoreBluetooth로 아두이노 불 켜기  (1) 2024.04.07
Background Threads, Queues  (0) 2024.04.07
ytw_developer