[swift] Swift Sourcery와 애니메이션 코드 자동 생성

Swift로 iOS 앱을 개발하는 과정에서, 일반적으로 코드 작성과 디자인 작업이 분리되어 진행됩니다. 특히 애니메이션 코드의 경우, 매번 반복해서 작성해야 하는 번거로움이 있습니다.

이런 문제를 해결하기 위해 Swift Sourcery를 사용하여 애니메이션 코드를 자동 생성할 수 있습니다. Sourcery는 Swift 소스 코드 생성 도구로, 소스 코드를 분석하여 원하는 코드를 생성해줍니다.

Sourcery 준비하기

Sourcery를 사용하기 위해서는 먼저 프로젝트에 Sourcery를 추가해야 합니다. 프로젝트의 Package.swift 파일에 다음 내용을 추가합니다:

// Package.swift

let package = Package(
    // ...
    dependencies: [
        // ...
        .package(url: "https://github.com/krzysztofzablocki/Sourcery.git", from: "1.0.0")
    ],
    targets: [
        // ...
        .target(
            name: "YourTarget",
            dependencies: [
                // ...
                "Sourcery"
            ]
        )
    ]
)

그리고 콘솔에서 다음 명령을 실행하여 Sourcery를 다운로드 받습니다:

$ swift package update

애니메이션 코드 자동 생성하기

Sourcery를 사용하여 애니메이션 코드를 자동 생성하기 위해서는 먼저 애니메이션을 적용할 뷰와 해당 애니메이션을 처리할 클래스를 작성합니다. 이를 @SourceryAutoGenerate 어노테이션으로 표시하여 Sourcery가 해당 클래스를 분석할 수 있도록 합니다. 예를 들어, 다음과 같은 애니메이션 클래스를 작성하겠습니다:

// Animation.swift

import UIKit

@objc
class Animation: NSObject {
    @objc
    @SourceryAutoGenerate
    func startAnimation(on view: UIView) {
        UIView.animate(withDuration: 1.0) {
            view.frame.origin.y += 100
        }
    }
}

위의 코드에서 @SourceryAutoGenerate 어노테이션은 Sourcery가 해당 메서드를 찾아서 자동으로 코드를 생성하도록 알려줍니다.

다음으로, Sourcery 템플릿 파일을 생성해야 합니다. 프로젝트의 루트 디렉토리에 sourcery.yml 파일을 생성하고, 다음과 같이 작성합니다:

// sourcery.yml

sources:
  - "./YourProject"
templates:
  - "./Templates"
output: "./Generated"

위의 설정에서는 ./YourProject 디렉토리에 있는 소스 코드를 분석하고, ./Templates 디렉토리에 위치한 템플릿 파일을 사용하여 코드를 생성합니다. 생성된 코드는 ./Generated 디렉토리에 저장됩니다.

마지막으로, 템플릿 파일을 작성해야 합니다. ./Templtes 디렉토리를 생성하고, 해당 디렉토리에 Animation.stencil 파일을 생성합니다:

// ./Templates/Animation.stencil

{% for type in types.annotated as type %}
extension {{type.annotations.annotations.first?.name}} {
    @objc
    @SourceryGenerated
    func startAnimation(on view: UIView) {
        UIView.animate(withDuration: 1.0) {
            view.frame.origin.y += 100
        }
    }
}
{% endfor %}

위의 템플릿 파일은 Animation.swift 파일에 있는 startAnimation(on:) 메서드의 코드를 생성하는 역할을 하며, @SourceryGenerated 어노테이션을 추가하여 Sourcery가 해당 코드를 생성했음을 표시합니다.

이제 콘솔에서 다음 명령을 실행하여 Sourcery를 실행합니다:

$ sourcery --config sourcery.yml

위의 명령은 설정 파일을 기반으로 Sourcery를 실행하고, 템플릿 파일에 정의된 코드를 생성하여 ./Generated 디렉토리에 저장합니다.

결과 확인하기

Sourcery를 실행한 후, 코드가 자동으로 생성되었는지 확인해보겠습니다. ./Generated 디렉토리에 Animation.generated.swift 파일이 자동으로 생성된 것을 확인할 수 있습니다. 해당 파일을 분석해보면, Animation 클래스에 있는 startAnimation(on:) 메서드와 동일한 내용의 코드가 생성된 것을 확인할 수 있습니다.

이제 생성된 코드를 사용하여 애니메이션을 적용할 수 있습니다:

// ViewController.swift

class ViewController: UIViewController {
    let animation = Animation()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        animation.startAnimation(on: self.view)
    }
}

위의 코드에서 ViewController에서 Animation 클래스의 startAnimation(on:) 메서드를 호출하여 애니메이션을 적용하고 있습니다.

이렇게 Swift Sourcery를 사용하면 애니메이션 코드를 자동으로 생성하여 개발 과정을 단순화할 수 있습니다. 반복적인 코드 작성으로 인한 시간 낭비를 줄이고, 유지보수를 편리하게 할 수 있는 장점을 가지고 있습니다.

더 자세한 내용은 공식 Sourcery GitHub 저장소를 참고하세요.