Trong Swift bắt buộc, người ta thường sử dụng các thuộc tính được tính toán để cung cấp quyền truy cập thuận tiện vào dữ liệu mà không bị trùng lặp trạng thái.
Hãy nói rằng tôi có lớp này được tạo ra để sử dụng MVC bắt buộc:
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
}
// ...
}
Nếu tôi muốn tạo tương đương phản ứng với Kết hợp, ví dụ để sử dụng với SwiftUI, tôi có thể dễ dàng thêm @Published
vào các thuộc tính được lưu trữ để tạo Publisher
s, nhưng không phải cho các thuộc tính được tính toán.
@Published var userIsLoggedIn: Bool { // Error: Property wrapper cannot be applied to a computed property
currentUser != nil
}
Có nhiều cách giải quyết khác nhau mà tôi có thể nghĩ ra. Tôi có thể làm cho tài sản tính toán của tôi được lưu trữ thay thế và giữ cho nó được cập nhật.
Tùy chọn 1: Sử dụng trình quan sát thuộc tính:
class ReactiveUserManager1: ObservableObject {
@Published private(set) var currentUser: User? {
didSet {
userIsLoggedIn = currentUser != nil
}
}
@Published private(set) var userIsLoggedIn: Bool = false
// ...
}
Tùy chọn 2: Sử dụng một Subscriber
trong lớp của riêng tôi:
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)
}
// ...
}
Tuy nhiên, các cách giải quyết này không thanh lịch như các thuộc tính được tính toán. Chúng trùng lặp trạng thái và chúng không cập nhật đồng thời cả hai thuộc tính.
Điều gì sẽ tương đương với việc thêm Publisher
một thuộc tính được tính vào Kết hợp?
ObservableObject
. Bạn vốn đã cho rằng một ObservableObject
đối tượng sẽ có khả năng biến đổi, theo định nghĩa, không phải là trường hợp của Thuộc tính được tính toán .