আপনি সুইফটে কেভিও ব্যবহার করতে পারেন তবে কেবল সাবক্লাসের dynamic
বৈশিষ্ট্যের জন্য NSObject
। বিবেচনা করুন যে আপনি bar
কোনও Foo
শ্রেণীর সম্পত্তি পর্যবেক্ষণ করতে চেয়েছিলেন । সুইফট 4 এ, আপনার সাবক্লাসে সম্পত্তি bar
হিসাবে নির্দিষ্ট করুন :dynamic
NSObject
class Foo: NSObject {
@objc dynamic var bar = 0
}
তারপরে আপনি bar
সম্পত্তিটির পরিবর্তনগুলি পর্যবেক্ষণ করতে নিবন্ধন করতে পারেন । সুইফ্ট 4 এবং সুইফ্ট 3.2-এ, সুইফটে কী-মান পর্যবেক্ষণ ব্যবহারের ক্ষেত্রে বর্ণিত হিসাবে এটি ব্যাপকভাবে সরল করা হয়েছে :
class MyObject {
private var token: NSKeyValueObservation
var objectToObserve = Foo()
init() {
token = objectToObserve.observe(\.bar) { [weak self] object, change in // the `[weak self]` is to avoid strong reference cycle; obviously, if you don't reference `self` in the closure, then `[weak self]` is not needed
print("bar property is now \(object.bar)")
}
}
}
দ্রষ্টব্য, সুইফ্ট 4-এ, আমাদের এখন ব্যাকস্ল্যাশ অক্ষর ব্যবহার করে কীপ্যাথগুলির শক্ত টাইপিং রয়েছে ( অবজেক্টটির সম্পত্তি \.bar
দেখাবার জন্য কীপ্যাথটি bar
)। এছাড়াও, এটি সমাপ্তির সমাপ্তির ধরণটি ব্যবহার করার কারণে, আমাদের পর্যবেক্ষণকারীগুলিকে ম্যানুয়ালি সরিয়ে ফেলতে হবে না (যখন token
সুযোগের বাইরে চলে যায়, পর্যবেক্ষক আমাদের জন্য সরিয়ে দেওয়া হয়) বা super
কীটি না পারলে বাস্তবায়ন কল করার বিষয়ে আমাদের চিন্তা করতে হবে না ম্যাচ. এই নির্দিষ্ট পর্যবেক্ষককে অনুরোধ করা হলেই ক্লোজারটি ডাকা হয়। আরও তথ্যের জন্য, ডাব্লুডাব্লুডিসি 2017 ভিডিও দেখুন, ফাউন্ডেশনে নতুন কী রয়েছে ।
সুইফট 3 এ পর্যবেক্ষণ করতে এটি কিছুটা জটিল, তবে উদ্দেশ্য-সি-তে যা কিছু ঘটে তার সাথে খুব মিল। যথা, আপনি বাস্তবায়ন করবেন observeValue(forKeyPath keyPath:, of object:, change:, context:)
যা (ক) নিশ্চিত করে যে আমরা আমাদের প্রসঙ্গে কাজ করছি (এবং এমন কিছু নয় যা আমাদের super
নজরে পর্যবেক্ষণের জন্য নিবন্ধিত হয়েছিল); এবং তারপরে (খ) হয় এটি পরিচালনা করুন বা super
প্রয়োজনীয় হিসাবে এটি বাস্তবায়নের জন্য প্রেরণ করুন । এবং উপযুক্ত হলে নিজেকে পর্যবেক্ষক হিসাবে সরিয়ে দেওয়ার বিষয়টি নিশ্চিত করুন। উদাহরণস্বরূপ, পর্যবেক্ষককে এটি হ্রাস করা হলে আপনি মুছে ফেলতে পারেন:
সুইফ্ট 3 এ:
class MyObject: NSObject {
private var observerContext = 0
var objectToObserve = Foo()
override init() {
super.init()
objectToObserve.addObserver(self, forKeyPath: #keyPath(Foo.bar), options: [.new, .old], context: &observerContext)
}
deinit {
objectToObserve.removeObserver(self, forKeyPath: #keyPath(Foo.bar), context: &observerContext)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard context == &observerContext else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
return
}
// do something upon notification of the observed object
print("\(keyPath): \(change?[.newKey])")
}
}
দ্রষ্টব্য, আপনি কেবল এমন বৈশিষ্ট্যগুলি পর্যবেক্ষণ করতে পারেন যা উদ্দেশ্য-সিতে প্রতিনিধিত্ব করা যেতে পারে। সুতরাং, আপনি জেনেরিকস, সুইফট struct
প্রকার, সুইফট enum
প্রকার ইত্যাদি পর্যবেক্ষণ করতে পারবেন না
সুইফট 2 বাস্তবায়ন সম্পর্কিত আলোচনার জন্য নীচে আমার আসল উত্তরটি দেখুন।
ব্যবহার dynamic
KVO অর্জনে সঙ্গে শব্দ NSObject
উপশ্রেণী বর্ণনা করা হয় কী-মান পর্যবেক্ষণ বিভাগে দত্তক কোকো ডিজাইন কনভেনশন অধ্যায় কোকো এবং উদ্দেশ্য সি এর মাধ্যমে ব্যবহার সুইফট গাইড:
কী-মান পর্যবেক্ষণ হ'ল এমন একটি প্রক্রিয়া যা অন্য বস্তুর নির্দিষ্ট বৈশিষ্ট্যগুলিতে পরিবর্তনের বিষয়ে অবজেক্টগুলিকে অবহিত করতে দেয়। ক্লাসটি ক্লাস থেকে উত্তরাধিকার সূত্রে যতক্ষণ না আপনি সুইফ্ট শ্রেণীর সাথে পর্যবেক্ষণকৃত কী-মান ব্যবহার করতে পারেন NSObject
। আপনি এই তিনটি পদক্ষেপটি সুইফটে কী-মান পর্যবেক্ষণ বাস্তবায়নের জন্য ব্যবহার করতে পারেন।
dynamic
আপনি যে কোনও সম্পত্তি পর্যবেক্ষণ করতে চান তাতে সংশোধক যুক্ত করুন । সম্পর্কিত আরও তথ্যের জন্য dynamic
, গতিশীল প্রেরণের প্রয়োজনীয়তা দেখুন ।
class MyObjectToObserve: NSObject {
dynamic var myDate = NSDate()
func updateDate() {
myDate = NSDate()
}
}
একটি বৈশ্বিক প্রসঙ্গের পরিবর্তনশীল তৈরি করুন।
private var myContext = 0
কী-পাথের জন্য একটি পর্যবেক্ষক যুক্ত করুন, এবং observeValueForKeyPath:ofObject:change:context:
পদ্ধতিটি ওভাররাইড করুন এবং পর্যবেক্ষককে সরিয়ে ফেলুন deinit
।
class MyObserver: NSObject {
var objectToObserve = MyObjectToObserve()
override init() {
super.init()
objectToObserve.addObserver(self, forKeyPath: "myDate", options: .New, context: &myContext)
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
if context == &myContext {
if let newValue = change?[NSKeyValueChangeNewKey] {
print("Date changed: \(newValue)")
}
} else {
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
}
}
deinit {
objectToObserve.removeObserver(self, forKeyPath: "myDate", context: &myContext)
}
}
[দ্রষ্টব্য, পরবর্তীকালে এই কেভিও আলোচনাটি ইউজিং সুইফট উইথ কোকো এবং অবজেক্টিভ-সি গাইড থেকে সরানো হয়েছে , যা সুইফ্ট 3-এর জন্য অভিযোজিত হয়েছে, তবে এটি এখনও এই উত্তরের শীর্ষে বর্ণিত হিসাবে কাজ করে]]
এটি লক্ষণীয় যে সুইফ্টের নিজস্ব দেশীয় সম্পত্তি পর্যবেক্ষক সিস্টেম রয়েছে, তবে এটি এমন একটি শ্রেণীর জন্য যা নিজস্ব কোড নির্দিষ্ট করে যা তার নিজস্ব সম্পত্তি পর্যবেক্ষণের পরে সঞ্চালিত হবে। অন্যদিকে কেভিও অন্য শ্রেণীর কিছু গতিশীল সম্পত্তির পরিবর্তনগুলি পর্যবেক্ষণ করতে নিবন্ধভুক্ত করার জন্য ডিজাইন করা হয়েছে।