অপরিহার্য সুইফটে, অনুলিপি অবস্থা ছাড়াই ডেটাতে সুবিধাজনক অ্যাক্সেস সরবরাহের জন্য গণিত বৈশিষ্ট্যগুলি ব্যবহার করা সাধারণ।
ধরা যাক এমভিসি ব্যবহারের জন্য আমি এই ক্লাসটি তৈরি করেছি:
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বস্তুর পারস্পরিক দক্ষতা থাকতে হবে যা সংজ্ঞা অনুসারে গণিত সম্পত্তির ক্ষেত্রে নয় ।