[swift] SwiftGen과 함께 사용하는 디자인 패턴

SwiftGen은 개발자들이 iOS 앱 개발 시 자주 사용되는 리소스를 자동으로 생성하고 관리할 수 있는 툴이다. 이 글에서는 SwiftGen과 함께 자주 사용되는 디자인 패턴에 대해 알아보겠다.

목차

확장

확장은 Swift에서 이미 존재하는 타입에 기능을 추가하는 방법이다. SwiftGen을 사용하여 생성된 코드에 확장을 이용하여 추가적인 기능을 구현할 수 있다. 예를 들어, SwiftGen으로 생성된 코드에서 이미지의 크기, 색상 또는 애니메이션을 관리하고 싶다면, 해당 타입에 확장을 추가하여 사용할 수 있다.

// SwiftGen으로 생성한 이미지 리소스
enum ImageAsset {
    case icon
    // ...
}

// 이미지 리소스에 관련된 추가 기능 구현
extension ImageAsset {
    func setColor(_ color: UIColor) {
        // 이미지에 색상을 적용하는 로직 구현
    }
    
    func resize(to size: CGSize) {
        // 이미지를 크기 조정하는 로직 구현
    }
    
    func animate() {
        // 이미지 애니메이션을 실행하는 로직 구현
    }
}

싱글톤

싱글톤은 앱 전체에서 단일 인스턴스를 공유하고 해당 인스턴스에 접근하는 디자인 패턴이다. SwiftGen을 사용하여 생성된 코드를 싱글톤 패턴으로 확장하여 리소스 관리를 간단하게 할 수 있다.

// SwiftGen으로 생성한 색상 리소스
enum ColorAsset {
    case primary
    // ...
}

// 싱글톤으로 리소스를 관리하기 위한 클래스
class ColorManager {
    static let shared = ColorManager()
    
    private init() {}
    
    func getColor(_ colorAsset: ColorAsset) -> UIColor {
        // 싱글톤으로 관리하는 리소스를 반환하는 로직 구현
    }
}

팩토리

팩토리는 객체 생성을 추상화하는 디자인 패턴으로, 객체를 생성하기 위한 별도의 클래스 또는 메소드를 제공한다. SwiftGen과 함께 팩토리 패턴을 사용하여 리소스를 생성하는 클래스를 만들 수 있다. 예를 들어, SwiftGen으로 생성된 코드에서 문자열 리소스를 사용하는 경우 팩토리 패턴을 이용하여 문자열을 생성할 수 있다.

// SwiftGen으로 생성한 문자열 리소스
enum LocalizedString {
    case welcomeMessage
    // ...
}

// 문자열 리소스를 생성하는 팩토리 클래스
class LocalizationFactory {
    static func createString(_ stringAsset: LocalizedString) -> String {
        // 팩토리 패턴을 이용하여 문자열 리소스를 생성하는 로직 구현
    }
}

빌더

빌더는 객체 생성 과정을 단계별로 나누어 객체를 생성하는 디자인 패턴이다. SwiftGen으로 생성된 코드에 빌더 패턴을 적용하여 객체를 생성하는 과정을 더욱 유연하게 관리할 수 있다. 예를 들어, SwiftGen으로 생성된 코드에서 뷰 리소스를 사용하는 경우 빌더 패턴을 이용하여 뷰를 생성할 수 있다.

// SwiftGen으로 생성한 뷰 리소스
enum ViewAsset {
    case loginButton
    // ...
}

// 뷰를 생성하고 구성하는 빌더 클래스
class ViewBuilder {
    private(set) var view: UIView
    
    init() {
        self.view = UIView()
    }
    
    func addLabel(with text: String) {
        // 뷰에 레이블을 추가하는 로직 구현
    }
    
    func addButton(with asset: ViewAsset) {
        // 뷰에 버튼을 추가하는 로직 구현
    }
    
    // ...
}

참고 자료