728x90
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 |
댓글