অপরিহার্য সুইফটে, অনুলিপি অবস্থা ছাড়াই ডেটাতে সুবিধাজনক অ্যাক্সেস সরবরাহের জন্য গণিত বৈশিষ্ট্যগুলি ব্যবহার করা সাধারণ।
ধরা যাক এমভিসি ব্যবহারের জন্য আমি এই ক্লাসটি তৈরি করেছি:
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
}
// ...
}
আমি যদি কম্বাইনের সাথে যেমন একটি প্রতিক্রিয়াশীল সমতুল্য তৈরি করতে চাই, যেমন সুইফটুআইয়ের সাথে ব্যবহারের জন্য, আমি সহজেই @Published
সঞ্চিত বৈশিষ্ট্যগুলিতে Publisher
এস উত্পাদন করতে যোগ করতে পারি, তবে গুণিত বৈশিষ্ট্যের জন্য নয়।
@Published var userIsLoggedIn: Bool { // Error: Property wrapper cannot be applied to a computed property
currentUser != nil
}
আমি চিন্তা করতে পারে বিভিন্ন workarounds আছে। আমি পরিবর্তে আমার গণিত সম্পত্তি সঞ্চয় করতে এবং এটি আপডেট রাখতে পারি।
বিকল্প 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)
}
// ...
}
যাইহোক, এই workarounds গণিত বৈশিষ্ট্য হিসাবে মার্জিত নয়। তারা সদৃশ অবস্থায় থাকে এবং তারা উভয় সম্পত্তি একই সাথে আপডেট করে না।
Publisher
কম্বাইনে একটি গণনা করা সম্পত্তিতে যুক্ত করার উপযুক্ত সমতুল্য কী হবে ?
ObservableObject
। আপনি অন্তর্নিহিতভাবে ধরে নিয়েছেন যে কোনও ObservableObject
বস্তুর পারস্পরিক দক্ষতা থাকতে হবে যা সংজ্ঞা অনুসারে গণিত সম্পত্তির ক্ষেত্রে নয় ।