[Swift] Invalidating property wrapper

서론

WWDC21의 What’s new in AppKit 강의에서 Invalidating 이라는 새로운 property wrapper가 소개되었습니다. (AppKit 기준) 혹시 iOS는 이런 거 없나? 싶어서 애플 개발자 문서를 뒤적거리다보니 NSView뿐만이 아니라 UIView에 대해서도 지원을 하고 있어 간단히 기록해보고자 합니다.

본론

WWDC 21 에서는 AppKit 기준 뱃지 컴포넌트를 예시로 설명을 했습니다.

이번에도 아래와 같은 뱃지 컴포넌트를 만든다고 생각한다면..

@IBDesignable
final class BadgeView: UIView {

    @IBInspectable var color: UIColor = .systemGray {
        didSet {
            setNeedsDisplay()
        }
    }
    
    @IBInspectable var dotLength: CGFloat = 16 {
        didSet {
            setNeedsDisplay()
            invalidateIntrinsicContentSize()
        }
    }
   
    override var intrinsicContentSize: CGSize {
        // ⋯
    }
    
    override func draw(_ rect: CGRect) {
        // ⋯
    }
}

위와 같이 특정 프로퍼티에 값이 변경될 때 마다 didSet를 통해 특정 메소드들을 호출해줘야 합니다.

하지만 Invalidating Property Wrapper를 사용하면 위 처럼 특정 메소드들을 호출해주지 않아도 됩니다.

@IBDesignable
final class BadgeView: UIView {

     @IBInspectable @Invalidating(.display) var color: UIColor = .systemGray
     @IBInspectable @Invalidating(.display, .intrinsicContentSize) var dotLength: CGFloat = 16

}

훨씬 코드가 간결해졌습니다. 지원되는 업데이트 무효화 타입은 여기에 정의되어 있으니 적합한 업데이트 유형을 선택하시면 됩니다.

결론

Property Wrapper 최고