본문 바로가기
Swift

[Swift] Extension에 storedProperty 선언하기

by Sky Titan 2022. 3. 26.
728x90
 

Adding stored properties to an extension - André Salla

Almost every iOS developer already faced this not-so-friendly message: Yeah. Extensions cannot contain stored properties. If you need to add a property to a native component, you must create your own button inheriting from UIButton. In my opinion, creating

andresalla.com

Extension에 storedProperty 선언하기

다들 알다시피 swift의 extension안에는 instance stored property를 선언할 수가 없다.

때문에 computed property를 활용해서 다른 곳에 해당 property값을 저장하고 가져와야 한다.

 

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let view: UIView = UIView()
        view.isSkeletonable = true
        
        let view2: UIView = UIView()
        
        print(view.isSkeletonable) //출력: true
        print(view2.isSkeletonable)//출력: false
        
    }
    
}

extension UIView {
    private struct KeyHolder {
        static var isSkeletonable: UInt8 = 0
    }
    
    var isSkeletonable: Bool {
        get {
            (objc_getAssociatedObject(self, &KeyHolder.isSkeletonable) as? Bool) ?? false
        }
        
        set {
            objc_setAssociatedObject(self, &KeyHolder.isSkeletonable, newValue, .OBJC_ASSOCIATION_COPY)
        }
    }
    
}

위와 같이 objc_getAssociatedObject, objc_setAssociatedObject를 활용했다.

사실 처음보는 메서드들이긴 한데, 역할은 특정 object의, 특정 key값에 대한 value를 저장하고 반환해주는 역할이다.

instance별로 caching을 해주는? 그런 역할인 것 같다.

728x90

'Swift' 카테고리의 다른 글

[Swift] closure 내부의 weak self 사용  (0) 2022.04.03
[Swift] allSatisfy(_:)  (0) 2022.03.28
[Swift] Property Wrapper  (0) 2022.02.13
[Swift] self vs Self  (0) 2021.12.08
[Swift] Dynamic Dispatch vs Static Dispatch  (0) 2021.12.05

댓글