अनिवार्य स्विफ्ट में, राज्य की नकल के बिना डेटा तक सुविधाजनक पहुंच प्रदान करने के लिए गणना की गई संपत्तियों का उपयोग करना आम है।
मान लीजिए कि मेरे पास अनिवार्य 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
}
// ...
}
अगर मैं Combine के साथ एक प्रतिक्रियाशील समतुल्य बनाना चाहता हूं, उदाहरण के लिए SwiftUI के साथ उपयोग करने के लिए, मैं आसानी @Published
से संग्रहीत संपत्तियों को जोड़ सकता हूँ Publisher
s उत्पन्न करने के लिए , लेकिन संगणित गुणों के लिए नहीं।
@Published var userIsLoggedIn: Bool { // Error: Property wrapper cannot be applied to a computed property
currentUser != nil
}
ऐसे विभिन्न कार्यदक्ष हैं, जिनके बारे में मैं सोच सकता था। मैं अपनी गणना की हुई संपत्ति को इसके बदले संग्रहीत कर सकता था और उसे अद्यतन रख सकता था।
विकल्प 1: एक संपत्ति पर्यवेक्षक का उपयोग करना:
class ReactiveUserManager1: ObservableObject {
@Published private(set) var currentUser: User? {
didSet {
userIsLoggedIn = currentUser != nil
}
}
@Published private(set) var userIsLoggedIn: Bool = false
// ...
}
विकल्प 2: Subscriber
मेरी अपनी कक्षा में उपयोग करना :
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)
}
// ...
}
हालांकि, ये वर्कअराउंड गणना गुणों के रूप में सुरुचिपूर्ण नहीं हैं। वे राज्य की नकल करते हैं और वे एक साथ दोनों गुणों को अपडेट नहीं करते हैं।
Publisher
कंबाइन में एक कम्प्यूटेड संपत्ति में एक जोड़ने के लिए एक उचित समकक्ष क्या होगा ?
ObservableObject
। आप स्वाभाविक रूप से मान लेते हैं कि किसी ObservableObject
वस्तु में परिवर्तन करने की क्षमता होनी चाहिए, जो कि परिभाषा के अनुसार, कम्प्यूटेड संपत्ति के मामले में नहीं है ।