-
Builder - dynamicMemberLookup (+ KeyPath)Swift 2021. 9. 30. 13:22
dynamicMemberLookup (+ KeyPath)
Swift 4.2의 변경사항 Dictionary 형태의 값을 subscript(dynamicMember:)를 사용해서 값을 마치 property처럼 사용이 가능하도록 하는것으로 이해했다. 아래의 예제가 도움이 될것이다! (참고는 https://github.c..
kkimin.tistory.com
이 글을 작성하면서 공부한 내용은 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 }
Swift then 사용
Then 이란? 전수열개발자님께서 만든 then은 ReadMe에 있는 예제만 보고도 우리가 흔히 쓰던 무엇을 then으로 만들었는지 알 수 있습니다. (클로저를 통해 인스턴스를 생성했을때 원하는 처리를 할 수
kkimin.tistory.com
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