SwiftUI

Generics (T)모든 타입에 대응하기

ytw_developer 2024. 4. 13. 14:49
Generics Type이란 어떤 타입이든 대응할 수 있도록 해주는 타입으로 T 키워드로 주로 사용됩니다

 

사용하는 상황

사용하기 전에는 같은 내용이지만 타입이 다르기 때문에 모델을 분리해서 2개를 만들어야 하는 상황이 있을 수 있습니다.

struct StringModel {
    let info: String?
    
    func removeInfo() -> StringModel {
        return StringModel(info: nil)
    }
}

struct BoolModel {
    let info: Bool?
    
    func removeInfo() -> BoolModel {
        BoolModel(info: nil)
    }
}

 

사용 후

사용 후에는 <Generic Type> 키워드를 사용하여 Generic으로 만들 수 있으며 Generic Type은 원하는 키워드로 대체할 수 있는데 주로 개발자들은 T를 사용하여 개발을 많이 합니다.

struct GenericModel<T> { // T=type
    let info: T?
    
    func removeInfo() -> GenericModel {
        GenericModel(info: nil)
    }
}

 

Generics으로 뷰 만들기

그 외에도 View 또한 Generics를 이용하여 만들 수 있는데 방법은 다음과 같습니다.

Generics 으로 뷰를 만들기 위해서는 Generics Type 키워드 옆에 :View를 붙여야 하는데 이는 Generics Type으로 들어오는 타입이 View 프로토콜을 준수해야 한다는 것을 의미합니다.

 

사용 예시

커스텀 뷰를 만들 수도 있는 것을 확인할 수 있습니다.

struct GenericView<T:View>: View { // T타입은 View 프로토콜을 준수해야지만 사용 될 수 있습니다
    
    let content: T
    let title: String
    
    var body: some View {
        VStack {
            Text(title)
            content
        }
    }
}

 

이후 다음처럼 사용됩니다.

struct ContentView: View {
    
    @StateObject private var vm = GenericsViewModel()
    
    var body: some View {
        VStack {
            GenericView(content: Text("커스텀 뷰"), title: "새로운 뷰")
        }
        .padding()
    }
}