Zorunlu Swift'te, durumu çoğaltmadan verilere kolay erişim sağlamak için hesaplanan özelliklerin kullanılması yaygındır.
Diyelim ki bu sınıf zorunlu MVC kullanımı için yapılmış:
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
}
// ...
}
Kombine ile reaktif bir eşdeğer oluşturmak istiyorsanız, örneğin SwiftUI ile kullanmak @Published
için, Publisher
s oluşturmak için saklanan özelliklere kolayca ekleyebilirim , ancak hesaplanan özellikler için değil.
@Published var userIsLoggedIn: Bool { // Error: Property wrapper cannot be applied to a computed property
currentUser != nil
}
Aklıma gelen çeşitli çözümler var. Bunun yerine hesaplanan mülkümü saklayabilir ve güncel tutabilirim.
Seçenek 1: Özellik gözlemcisi kullanma:
class ReactiveUserManager1: ObservableObject {
@Published private(set) var currentUser: User? {
didSet {
userIsLoggedIn = currentUser != nil
}
}
@Published private(set) var userIsLoggedIn: Bool = false
// ...
}
Seçenek 2: Subscriber
Kendi sınıfımda a kullanma :
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)
}
// ...
}
Ancak, bu geçici çözümler hesaplanan özellikler kadar zarif değildir. Durumu çoğaltırlar ve her iki özelliği de aynı anda güncellemezler.
Publisher
Combine'da hesaplanan bir özelliğe a eklemek için uygun eşdeğer ne olur ?
ObservableObject
. Doğası gereği, bir ObservableObject
nesnenin, Muhasebeleştirilmiş Özellik için geçerli olmayan bir mutasyon yeteneğine sahip olması gerektiğini varsayarsınız .