반응형
Observable
직접 만든 Observable이
어떤식으로 동작을 관찰하고 업데이트하는지 알고 싶어서 작성했습니다.
class Observable<T> {
// 2. value가 변하면 didSet에 의해 변경된 value 값을 갖고 listener 동작을 실행합니다.
var value: T? {
didSet {
self.listener?(value)
}
}
init(_ value: T?) {
self.value = value
}
// 동작을 담아두는 클로저입니다. (실행 X)
private var listener: ((T?) -> Void)?
// 1. 이 함수가 호출이 되면 아래와 같은 작업을 실행
func bind(_ listener: @escaping (T?) -> Void) {
// completion에서 value의 값을 갖고 동작을 실행시킨다.
listener(value)
// 다음으로 위의 동작을 listener에 저장시킨다.
self.listener = listener
}
}
ViewController & ViewModel
class CartViewModel {
var item: Observable<Int> = Observable(0)
}
class Cart {
var viewModel = CartViewModel()
var itemcCount = 0
func setBinding() {
viewModel.item.bind { [weak self] num in
guard let num = num else { return }
self?.itemcCount = num
}
}
func addCount(n: Int) {
viewModel.item.value = n
}
}
실행
let cart = Cart()
// 이 바인딩을 실행시켜주면 동작 실행 및 동작을 저장
cart.setBinding()
print(cart.itemcCount)
// 값이 바뀌면 didSet이 동작하며 setBinding에 저장해둔 동작을 실행
cart.addCount(n: 10)
print(cart.itemcCount)
cart.addCount(n: 20)
print(cart.itemcCount)
cart.addCount(n: 30)
print(cart.itemcCount)
// 0
// 10
// 20
// 30
반응형
'UIKit > Cheat Sheet' 카테고리의 다른 글
[iOS/Swift] plist의 데이터 가져오기 (Swift 5) (0) | 2023.03.29 |
---|---|
[iOS/Swift] 검색창(UISearchController)과 결과창(searchResultsController) 사이의 공간 없애기! (0) | 2023.02.22 |
[iOS/Swift] plist의 값 얻는 방법 및 Github에서 중요한 정보 숨기는 방법(API Key, Bundle, gitignore) (0) | 2023.02.10 |
[iOS/Swift] 개발 환경에 따라 각각의 다른 plist의 저장된 API Key 값 받아오기 (0) | 2023.02.10 |
[iOS/Swift] UIColor (RGB대신 HEX Color 이용하기) (0) | 2023.02.09 |