Swift 메서드 체인을 사용하여 편안하게 디자인 적용

9046 단어 XcodeiOSSwiftOSS
이 시기가 되면 금년이야말로 Advent Calender 참가하면 좋았어-, 라고 생각합니다만 다음 해에는 잊고 묻혀 있다는 것을 반복하고 있다. .

평상시 개인의 개발에서는 코드로 디자인 적용을 하는 것이 많습니다만, 번잡해지기 쉬운 코드를 메소드 체인을 사용해 쾌적하게 기술하려고 하는 이야기(+ 그것을 실현하는 OSS를 만든 이야기)입니다.

과제 : 코드에 의한 디자인 적용의 복잡성



일반적으로 코드로 디자인을 적용할 때는 다음과 같은 설명이 되는 경우가 많다고 생각합니다.
    let sampleLabel = UILabel()
    sampleLabel.backgroundColor = .yellow
    sampleLabel.text = "sample label"
    sampleLabel.textColor = .green
    sampleLabel.textAlignment = .center
    sampleLabel.font = .boldSystemFont(ofSize: 30.0)
    sampleLabel.numberOfLines = 0

이 쓰는 방법이라고 몇번이나 sampleLabel.~ 와 같은 기술을 하는 것이 번거롭고, 코드의 전망도 나빠지는 것 같은 생각이 듭니다.

클로저를 사용하는 패턴



그래서, 예를 들면, 스스로 다음과 같은 메소드를 정의해, 클로저내에서 대상에 스타일을 적용하는 것이 좋은 테크닉입니다.
    extension UILabel {
        func apply(_ closure: (_ this: UILabel) -> Void) -> Self {
            closure(self)
            return self
        }
    }

    sampleLabel.apply { this in
        this.backgroundColor(.yellow)
        this.text("sample label")
        this.textAlignment(.center)
        this.textColor(.green)
        this.font(.boldSystemFont(ofSize: 30.0))
        this.numberOfLines(0)
    }

이것이라도 코드를 확실히 보았을 때에는 충분히 묶여 있어 보통으로 기술하는 것보다 좋을 것 같습니다.
다만 매번 클로저를 쓰고 안에 기술하는 것은 조금 번거롭습니다. this.~ 와 같이 써야 하는 것은 통상시와 바뀌지 않습니다.

메소드 체인을 사용하는 패턴



Swift에서는 메소드 체인을 사용하여 더욱 간결한 기술을 할 수 있을 것입니다.

그렇게 생각해 만든 것이 ApplyStyleKit 입니다.
htps : // 기주 b. 코 m / 신 ぢ / 아 plySty ぇ t


ApplyStyleKit을 사용하면 다음과 같이 메소드 체인을 사용하여 스타일 적용 코드를 작성할 수 있습니다.
    sampleLabel.applyStyle
        .backgroundColor(.yellow)
        .text("sample label")
        .textAlignment(.center)
        .textColor(.green)
        .font(.boldSystemFont(ofSize: 30.0))
        .numberOfLines(0)

특징으로서는, applyStyle 및 그 뒤에 오는 메소드가 UIView를 직접 돌려주는 것이 아니라, UIView를 요소에 가지는 다른 객체(StyleObject라는 이름으로 정의)를 돌려주는 점입니다.

다음의 코드가 그 구현 부분이 됩니다.

public protocol ApplyStyleProtocol {
    associatedtype StyleCompatible
    var applyStyle: StyleObject<StyleCompatible> { get }
}

extension ApplyStyleProtocol {
    public var applyStyle: StyleObject<Self> {
        return StyleObject(self)
    }
}

public struct StyleObject<Base> {
    let base: Base

    init(_ base: Base) {
        self.base = base
    }
}

그리고는 UIKit의 UIView나 UILabel의 프로퍼티에 대응하는 메소드를 StyleObject의 extension으로 진흙으로 구현해 갈 뿐입니다.

이렇게 하면 기존의 메소드나 프로퍼티와 섞이지 않고 .applyStyle로 한 경우에만 대응하는 메소드를 사용할 수 있게 되어 Xcode의 보완을 더럽히지 않고 코드를 기술할 수 있습니다.
ApplyStyleKit로 기술한 결과를 통상의 스타일 적용 코드와 비교하면, 대상의 요소명이 한 번밖에 등장하지 않기 때문에 깨끗한 기술이 되었다고 생각합니다.

이 인터페이스를 실현하는 방법을 생각하고 있을 때 RxSwift의 .rx의 기술이 비슷하다고 생각하고 소스 코드를 보면, 정확히 하고 싶었던 것을 매우 적은 행수의 코드로 실현하고 있다 그래서 참고로 했습니다.

요약


  • 메소드 체인을 사용한 스타일 적용 코드를 작성할 수 있는 OSS를 만들었습니다. 구현도 특히 복잡한 일은 하고 있지 않으므로, 소스 코드를 읽어 좋으면 꼭 사용해 보세요.
  • 실현하고 싶은 코드의 구현이 생각하지 못했을 때는, 이상에 가까운 인터페이스를 제공하고 있는 OSS등의 코드를 읽으면 얻는 것이 많았습니다. 실제로 RxSwift의 해당 부분의 코드를 읽었을 때는 아름답고 감동했습니다. 또, 목적 없이 OSS의 코드를 모두 읽는 것은 상당히 힘들지만, 자신이 하고 싶은 포인트를 알고 있으면, 확실히 이해할 수 있으므로 추천입니다.

  • ApplyStyleKit은 방금 만들었고 지원하지 않는 UI Kit도 많지만 확장 자체는 비교적 쉽게 할 수 있다고 생각합니다. 좋으면 Contribute나 Star 기다리고 있습니다. 그럼.

    좋은 웹페이지 즐겨찾기