Dalam Swift imperatif, adalah umum untuk menggunakan properti yang dihitung untuk memberikan akses mudah ke data tanpa status duplikasi.
Katakanlah saya membuat kelas ini untuk penggunaan imperatif MVC:
class ImperativeUserManager {
private(set) var currentUser: User? {
didSet {
if oldValue != currentUser {
NotificationCenter.default.post(name: NSNotification.Name("userStateDidChange"), object: nil)
// Observers that receive this notification might then check either currentUser or userIsLoggedIn for the latest state
}
}
}
var userIsLoggedIn: Bool {
currentUser != nil
}
// ...
}
Jika saya ingin membuat setara reaktif dengan Combine, misalnya untuk digunakan dengan SwiftUI, saya dapat dengan mudah menambahkan @Published
ke properti yang disimpan untuk menghasilkan Publisher
s, tetapi tidak untuk properti yang dihitung.
@Published var userIsLoggedIn: Bool { // Error: Property wrapper cannot be applied to a computed property
currentUser != nil
}
Ada berbagai solusi yang dapat saya pikirkan. Sebagai gantinya, saya dapat membuat properti yang dihitung disimpan dan tetap diperbarui.
Opsi 1: Menggunakan pengamat properti:
class ReactiveUserManager1: ObservableObject {
@Published private(set) var currentUser: User? {
didSet {
userIsLoggedIn = currentUser != nil
}
}
@Published private(set) var userIsLoggedIn: Bool = false
// ...
}
Opsi 2: Menggunakan a Subscriber
di kelas saya sendiri:
class ReactiveUserManager2: ObservableObject {
@Published private(set) var currentUser: User?
@Published private(set) var userIsLoggedIn: Bool = false
private var subscribers = Set<AnyCancellable>()
init() {
$currentUser
.map { $0 != nil }
.assign(to: \.userIsLoggedIn, on: self)
.store(in: &subscribers)
}
// ...
}
Namun, solusi ini tidak seanggun properti yang dihitung. Mereka menduplikasi keadaan dan mereka tidak memperbarui kedua properti secara bersamaan.
Apa yang akan setara setara dengan menambahkan Publisher
ke properti yang dihitung di Combine?
ObservableObject
. Anda secara inheren berasumsi bahwa suatu ObservableObject
objek harus dapat memiliki kemampuan bermutasi yang, menurut definisi, bukan kasus untuk Computed Property .