junu0516 / airbnb

에어비앤비 클론코딩
1 stars 2 forks source link

property wrapper 를 구현해 중복코드 제거하기 #58

Closed Jinsujin closed 2 years ago

Jinsujin commented 2 years ago

문제점

코드로 뷰의 레이아웃을 잡기 위해 모든 view에

translatesAutoresizingMaskIntoConstraints = false 를 해 줘야 하는 문제가 있다.

let headerView = SearchResultRoomsHeaderView()
headerView.translatesAutoresizingMaskIntoConstraints = false

property wrapper 를 사용하면 이러한 중복코드를 한번 감싸서 숨길 수 있다.

property wrapper 의 정의는 아래처럼 할 수 있다:

@propertyWrapper
struct CodableLayoutView<T: UIView> {
    private var view: T = T()
    var wrappedValue: T {
        get {
            self.view.translatesAutoresizingMaskIntoConstraints = false
            return view
        }
        set { view = newValue }
    }
    init(view: T) {
        self.view = view
    }
}

이 property wrapper 를 이용하는 코드는 다음과 같다:

@LayoutCodable(view: stackView) var layoutStackView
self.addSubview(stackView)

NSLayoutConstraint.activate([
    layoutStackView.topAnchor.constraint(equalTo: topAnchor),
    layoutStackView.leadingAnchor.constraint(equalTo: leadingAnchor),
    layoutStackView.trailingAnchor.constraint(equalTo: trailingAnchor),
    layoutStackView.bottomAnchor.constraint(equalTo: bottomAnchor),
])

고민

중복코드인 myView.translatesAutoresizingMaskIntoConstraints = false 를 줄이기 위해 사용 했습니다. 하지만 사실상 property wrapper 를 사용했을때나, 사용하지 않았을때나 같은 코드 한줄