Давненько ничего не писал. Што ш - было и было. Начался WWDC 25, а у меня есть бесполезная привычка смотреть записи и тыкать палкой в новые фичи.
Не знаю, какой там рак на горе свитнул, но Эпплы сделали что-то реально прикольное и полезное - реализовали макрос
Observable для UIKit'а 💪 ! Работает он для: контроллеров, вьюх и коллекций. При обновлении модели у контроллера вызывается метод
viewWillLayoutSubviews.
class SampleViewController: UIViewController {
@IBOutlet var counterLabel: UILabel!
private let counterModel = Counter()
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
counterLabel.text = "\(counterModel.value)"
}
}
В случае UIView вызовется
layoutSubviews
class CounterView: UIView {
private let counterModel = Counter()
private let label = UILabel()
override init(frame: CGRect) { ... }
override func layoutSubviews() {
super.layoutSubviews()
label.text = "\(counterModel.value)"
}
}
Поддерживается вложенность. Внутренние классы придётся пометить макросом, структуры заработают сразу (что ожидаемо, так как те же Int'ы тоже структуры)
@Observable
class Counter {
var value: Int = 0
let innerModelClass = InnerModel()
var innerModelStruct = InnerModel2()
}
@Observable
class InnerModel {
var value: Int = 0
}
struct InnerModel2 {
var value: Int = 0
}
Бэкпорт до iOS 18 (скомпилируется и на iOS 17, лол), но нужно добавить флажок
UIObservationTrackingEnabled = YES в info.plist. Загрузить и потыкать компилирующиеся примеры можно здесь.