-
Builder - dynamicMemberLookup (+ KeyPath)Swift 2021. 9. 30. 13:22
이 글을 작성하면서 공부한 내용은 Builder Pattern 를 사용하면서 활용할 수 있었다.
해당 방법은 생성자 대신 빌더를 활용해 사용이 쉽고 가독성이 좋은 코드를 얻고 싶을때 사용할 수 있다! 아래 예제 코드를 보면 바로 이해가 될것같다.
import Foundation @dynamicMemberLookup public struct Builder<Base: AnyObject> { private let _build: () -> Base public init(_ build: @escaping () -> Base) { self._build = build } public init(_ base: Base) { self._build = { base } } public subscript<Value>(dynamicMember keyPath: ReferenceWritableKeyPath<Base, Value>) -> (Value) -> Builder<Base> { { [build = _build] value in Builder { let object = build() object[keyPath: keyPath] = value return object } } } public func build() -> Base { _build() } } public protocol LayoutCompatible { associatedtype LayoutBase: AnyObject var with: Builder<LayoutBase> { get set } } extension LayoutCompatible where Self: AnyObject { public var with: Builder<Self> { get { Builder(self) } set {} } } extension NSObject: LayoutCompatible {}
위 처럼 Builder struct를 생성해두고 아래처럼 사용 가능하다.
import UIKit // The actual implementation! let view = UILabel().with .backgroundColor(.red) .numberOfLines(2) .font(.systemFont(ofSize: 12, weight: .bold)) .build()
실제로 위 코드를 바탕으로 입맛에 맞춰 수정해 사용중이다. 가독성을 높이는데 도움이 된다.
출처 : https://gist.github.com/JeanVinge/18489ba5f61620e886d2375cbd448f55
++ 사용하면서 일정부분 비슷하게 작성하고 사용중이었던 부분을 발견할 수 있었는데 바로 다음과 같다. then 사용은 아래 글을 참고하면 좋을 것 같다.
let a = UIView().then { $0.translatesAutoresizingMaskIntoConstraints = false } private lazy var indicator2 = UIView().then { $0.translatesAutoresizingMaskIntoConstraints = false }
728x90'Swift' 카테고리의 다른 글
자꾸 까먹는 Swift Array 안전하게 배열 조회 하는법 (0) 2021.09.30 Computed Property + Access Control (0) 2021.09.30 dynamicMemberLookup (+ KeyPath) (0) 2021.09.23 ios 웹뷰와 통신 (Native <-> JavaScript 통신) (0) 2021.07.21 Combine (0) 2021.07.20