Swift 메서드 체인을 사용하여 편안하게 디자인 적용
평상시 개인의 개발에서는 코드로 디자인 적용을 하는 것이 많습니다만, 번잡해지기 쉬운 코드를 메소드 체인을 사용해 쾌적하게 기술하려고 하는 이야기(+ 그것을 실현하는 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의 기술이 비슷하다고 생각하고 소스 코드를 보면, 정확히 하고 싶었던 것을 매우 적은 행수의 코드로 실현하고 있다 그래서 참고로 했습니다.
요약
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
그래서, 예를 들면, 스스로 다음과 같은 메소드를 정의해, 클로저내에서 대상에 스타일을 적용하는 것이 좋은 테크닉입니다.
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의 기술이 비슷하다고 생각하고 소스 코드를 보면, 정확히 하고 싶었던 것을 매우 적은 행수의 코드로 실현하고 있다 그래서 참고로 했습니다.
요약
sampleLabel.applyStyle
.backgroundColor(.yellow)
.text("sample label")
.textAlignment(.center)
.textColor(.green)
.font(.boldSystemFont(ofSize: 30.0))
.numberOfLines(0)
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
}
}
ApplyStyleKit은 방금 만들었고 지원하지 않는 UI Kit도 많지만 확장 자체는 비교적 쉽게 할 수 있다고 생각합니다. 좋으면 Contribute나 Star 기다리고 있습니다. 그럼.
Reference
이 문제에 관하여(Swift 메서드 체인을 사용하여 편안하게 디자인 적용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shindyu/items/7cbbb444d4fa4130eb42텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)