কী-মান পর্যবেক্ষণ (কেভিও) সুইফটে উপলব্ধ?


174

যদি তা হয় তবে অবজেক্টিভ-সি-তে কী-মান পর্যবেক্ষণ ব্যবহার করার সময় এমন কোনও মূল পার্থক্য রয়েছে যা অন্যথায় উপস্থিত ছিল না?


2
একটি উদাহরণ প্রকল্প যা দেখায় যে কেভিও সুইট-এর মাধ্যমে ইউআইকিট ইন্টারফেসে ব্যবহৃত হচ্ছে: github.com/jameswomack/kvo-in-swift
james_womack

@ জানডভোরাক কেভিও প্রোগ্রামিং গাইড দেখুন , যা বিষয়টির একটি দুর্দান্ত ভূমিকা।
রব

1
যদিও আপনার প্রশ্নের উত্তর না হলেও আপনি ডেটসেট () ফাংশনটি ব্যবহার করে ক্রিয়া শুরু করতে পারেন।
ভিনসেন্ট

মনে রাখবেন আপনি যখন ব্যবহার করবেন তখন একটি সুইফট 4 বাগ রয়েছে.initial । একটি সমাধানের জন্য এখানে দেখুন । আমি অ্যাপলের ডক্সটি দেখার জন্য অত্যন্ত পরামর্শ দিচ্ছি । এটি সম্প্রতি আপডেট করা হয়েছে এবং প্রচুর গুরুত্বপূর্ণ নোটকে কভার করে। রবের অন্যান্য উত্তরও দেখুন
হানি

উত্তর:


107

(নতুন তথ্য যুক্ত করতে সম্পাদিত): সম্মিলিত কাঠামোটি কেভিও ব্যবহার না করে আপনি যা চান তা পূরণ করতে সহায়তা করতে পারে কিনা তা বিবেচনা করুন

হ্যা এবং না. কেভিও এনএসওজেক্ট সাবক্লাসে যেমনটি সর্বদা থাকে তেমন কাজ করে। এটি এমন ক্লাসগুলির জন্য কাজ করে না যেগুলি এনএসবজেক্ট সাবক্লাস করে না। সুইফ্টের (বর্তমানে কমপক্ষে) নিজস্ব নেটিভ পর্যবেক্ষণ সিস্টেম নেই।

(অন্যান্য সম্পত্তি কীভাবে ওবিজেসি হিসাবে প্রকাশ করতে হয় তার জন্য মন্তব্য দেখুন যাতে কেভিও তাদের উপর কাজ করে)

সম্পূর্ণ উদাহরণের জন্য অ্যাপল ডকুমেন্টেশন দেখুন ।


74
এক্সকোড 6 বিটা 5 যেহেতু আপনি dynamicকেভিও সমর্থন সক্ষম করতে যে কোনও সুইফ্ট শ্রেণিতে কীওয়ার্ডটি ব্যবহার করতে পারেন ।
চমত্কার

7
@ ফ্যাব এর জন্য হুর! স্বচ্ছতার জন্য, dynamicকীওয়ার্ডটি সেই সম্পত্তিটিতে যায় যা আপনি কী-মান-পর্যবেক্ষণযোগ্য করতে চান।
জেরি

5
মূলশব্দটির ব্যাখ্যা dynamicঅ্যাপল বিকাশকারী লাইব্রেরির ইউজিং সুইফট উইথ কোকো এবং অবজেক্টিভ-সি বিভাগে পাওয়া যাবে
Imanou পেটিট

6
যেহেতু এটি আমার কাছে ফেব্বের মন্তব্য থেকে পরিষ্কার ছিল না: আপনি যে ক্লাসের কেভিও অনুগত হতে চান (কোনও শ্রেণিতে নিজেই মূলশব্দ নয়) শ্রেণীর ভিতরে থাকা dynamicকোনও বৈশিষ্ট্যের জন্য কীওয়ার্ডটি ব্যবহার করুন dynamic। এটি আমার পক্ষে কাজ করেছিল!
টিম ক্যামবার

1
আসলে তা না; আপনি "বাইরের" থেকে একটি নতুন ডডসেটটি নিবন্ধন করতে পারবেন না, এটি সংকলনের সময় সেই ধরণের অংশ হতে হবে।
ক্যাটফিশ_মান

155

আপনি সুইফটে কেভিও ব্যবহার করতে পারেন তবে কেবল সাবক্লাসের dynamicবৈশিষ্ট্যের জন্য NSObject। বিবেচনা করুন যে আপনি barকোনও Fooশ্রেণীর সম্পত্তি পর্যবেক্ষণ করতে চেয়েছিলেন । সুইফট 4 এ, আপনার সাবক্লাসে সম্পত্তি barহিসাবে নির্দিষ্ট করুন :dynamicNSObject

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 বাস্তবায়ন সম্পর্কিত আলোচনার জন্য নীচে আমার আসল উত্তরটি দেখুন।


ব্যবহার dynamicKVO অর্জনে সঙ্গে শব্দ NSObjectউপশ্রেণী বর্ণনা করা হয় কী-মান পর্যবেক্ষণ বিভাগে দত্তক কোকো ডিজাইন কনভেনশন অধ্যায় কোকো এবং উদ্দেশ্য সি এর মাধ্যমে ব্যবহার সুইফট গাইড:

কী-মান পর্যবেক্ষণ হ'ল এমন একটি প্রক্রিয়া যা অন্য বস্তুর নির্দিষ্ট বৈশিষ্ট্যগুলিতে পরিবর্তনের বিষয়ে অবজেক্টগুলিকে অবহিত করতে দেয়। ক্লাসটি ক্লাস থেকে উত্তরাধিকার সূত্রে যতক্ষণ না আপনি সুইফ্ট শ্রেণীর সাথে পর্যবেক্ষণকৃত কী-মান ব্যবহার করতে পারেন NSObject। আপনি এই তিনটি পদক্ষেপটি সুইফটে কী-মান পর্যবেক্ষণ বাস্তবায়নের জন্য ব্যবহার করতে পারেন।

  1. dynamicআপনি যে কোনও সম্পত্তি পর্যবেক্ষণ করতে চান তাতে সংশোধক যুক্ত করুন । সম্পর্কিত আরও তথ্যের জন্য dynamic, গতিশীল প্রেরণের প্রয়োজনীয়তা দেখুন ।

    class MyObjectToObserve: NSObject {
        dynamic var myDate = NSDate()
        func updateDate() {
            myDate = NSDate()
        }
    }
    
  2. একটি বৈশ্বিক প্রসঙ্গের পরিবর্তনশীল তৈরি করুন।

    private var myContext = 0
  3. কী-পাথের জন্য একটি পর্যবেক্ষক যুক্ত করুন, এবং 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-এর জন্য অভিযোজিত হয়েছে, তবে এটি এখনও এই উত্তরের শীর্ষে বর্ণিত হিসাবে কাজ করে]]


এটি লক্ষণীয় যে সুইফ্টের নিজস্ব দেশীয় সম্পত্তি পর্যবেক্ষক সিস্টেম রয়েছে, তবে এটি এমন একটি শ্রেণীর জন্য যা নিজস্ব কোড নির্দিষ্ট করে যা তার নিজস্ব সম্পত্তি পর্যবেক্ষণের পরে সঞ্চালিত হবে। অন্যদিকে কেভিও অন্য শ্রেণীর কিছু গতিশীল সম্পত্তির পরিবর্তনগুলি পর্যবেক্ষণ করতে নিবন্ধভুক্ত করার জন্য ডিজাইন করা হয়েছে।


এর উদ্দেশ্য কী myContextএবং আপনি একাধিক সম্পত্তি কীভাবে পালন করবেন?

1
মতে KVO প্রোগ্রামিং গাইড : "আপনি কি একটি পর্যবেক্ষক হিসাবে একটি বস্তু রেজিস্টার করো, তখন আপনি একটি প্রদান করতে পারেন contextপয়েন্টার। contextযখন পয়েন্টার পর্যবেক্ষক প্রদান করা হয় observeValueForKeyPath:ofObject:change:context:প্রার্থনা করা হয়। contextপয়েন্টার একটি সি পয়েন্টার অথবা একটি অবজেক্ট রেফারেন্স হতে পারে। contextপয়েন্টার হতে পারে পরিবর্তনটি পর্যবেক্ষণ করা হচ্ছে তা নির্ধারণ করতে বা পর্যবেক্ষককে কিছু অন্যান্য ডেটা সরবরাহ করতে একটি অনন্য সনাক্তকারী হিসাবে ব্যবহৃত used "
রব

আপনাকে ডিনিট
জ্যাকি

3
@ ডিভথ, যেমনটি আমি বুঝতে পেরেছি, যদি সাবক্লাস বা সুপারক্লাস একই ভেরিয়েবলের জন্য কেভিও পর্যবেক্ষককে নিবন্ধিত করে, পর্যবেক্ষণভালিউফোর্কিপিথ একাধিকবার ডাকা হবে। প্রসঙ্গটি এই পরিস্থিতিতে নিজস্ব বিজ্ঞপ্তিগুলি আলাদা করতে ব্যবহার করা যেতে পারে। এ সম্পর্কে আরও: dribin.org/dave/blog/archives/2008/09/24/proper_kvo_usage
জেমে

1
আপনি যদি optionsখালি ছেড়ে চলে যান তবে এর অর্থ হ'ল changeপুরানো বা নতুন মানটি অন্তর্ভুক্ত হবে না (যেমন আপনি কেবলমাত্র অবজেক্টটি উল্লেখ করেই নতুন মানটি পেতে পারেন)। যদি আপনি কেবল নির্দিষ্ট করে থাকেন .newএবং না করেন .oldতবে এর অর্থ হ'ল changeকেবলমাত্র নতুন মান অন্তর্ভুক্ত থাকবে তবে পুরানো মানটি নয় (যেমন আপনি প্রায়শই পুরানো মানটি কী তা যত্নশীল হন না তবে কেবলমাত্র নতুন মান সম্পর্কে যত্নশীল হন)। আপনি যদি observeValueForKeyPathপুরানো এবং নতুন মান উভয়ই পাস করতে চান তবে নির্দিষ্ট করে দিন [.new, .old]। নীচের লাইনটি, অভিধানে optionsকী অন্তর্ভুক্ত রয়েছে তা সুনির্দিষ্ট করে change
রব

92

হ্যাঁ এবং না উভয়ই:

  • হ্যাঁ , আপনি উদ্দেশ্য-সি অবজেক্টগুলি পর্যবেক্ষণ করতে সুইফটে একই পুরানো কেভিও এপিআই ব্যবহার করতে পারেন।
    আপনি dynamicউত্তরাধিকার সূত্রে সুইফট অবজেক্টগুলির বৈশিষ্ট্যও পর্যবেক্ষণ করতে পারেন NSObject
    তবে ... না আপনি সুইফট নেটিভ পর্যবেক্ষণ সিস্টেমটি যেমন আশা করতে পারেন তেমন দৃ strongly়ভাবে টাইপ করা হয়নি।
    সুইচ ব্যবহার করে কোকো এবং অবজেক্টিভ-সি | কী মান পর্যবেক্ষণ

  • না , বর্তমানে স্বেচ্ছাচারী সুইফট অবজেক্টগুলির জন্য কোনও বিল্টিন মান পর্যবেক্ষণ ব্যবস্থা নেই।

  • হ্যাঁ , এখানে অন্তর্নির্মিত সম্পত্তি পর্যবেক্ষক রয়েছে , যা দৃ strongly ়ভাবে টাইপ করা হয়।
    তবে ... না তারা কেভিও নয়, যেহেতু তারা কেবলমাত্র নিজস্ব সম্পত্তি পর্যবেক্ষণের জন্য অনুমতি দেয়, নেস্টেড পর্যবেক্ষণগুলি ("মূল পাথ") সমর্থন করবেন না এবং আপনাকে সেগুলি স্পষ্টভাবে বাস্তবায়ন করতে হবে।
    সুইফ্ট প্রোগ্রামিং ভাষা | সম্পত্তি পর্যবেক্ষক

  • হ্যাঁ , আপনি সুস্পষ্ট মান পর্যবেক্ষণ বাস্তবায়ন করতে পারেন, যা দৃ strongly়ভাবে টাইপ করা হবে এবং অন্যান্য বস্তু থেকে একাধিক হ্যান্ডলার যোগ করার অনুমতি দেয় এবং এমনকি নেস্টিং / "কী পাথ" সমর্থন করে।
    তবে ... না এটি কেভিও হবে না কারণ এটি কেবলমাত্র সেই সম্পত্তিগুলির জন্য কাজ করবে যা আপনি পর্যবেক্ষণযোগ্য হিসাবে প্রয়োগ করেন।
    আপনি এখানে যেমন মান পর্যবেক্ষণ বাস্তবায়নের জন্য একটি গ্রন্থাগার পেতে পারেন:
    পর্যবেক্ষণযোগ্য-সুইফ্ট - সুইফটের জন্য কেভিও - মান পর্যবেক্ষণ এবং ইভেন্টগুলি


10

একটি উদাহরণ এখানে কিছুটা সাহায্য করতে পারে। যদি আমার সাথে গুণাবলীর সাথে modelক্লাসের উদাহরণ থাকে এবং আমি সেই বৈশিষ্ট্যগুলি এর সাথে পর্যবেক্ষণ করতে পারি:Modelnamestate

let options = NSKeyValueObservingOptions([.New, .Old, .Initial, .Prior])

model.addObserver(self, forKeyPath: "name", options: options, context: nil)
model.addObserver(self, forKeyPath: "state", options: options, context: nil)

এই বৈশিষ্ট্যগুলির পরিবর্তনগুলি এখানে কলটি ট্রিগার করবে:

override func observeValueForKeyPath(keyPath: String!,
    ofObject object: AnyObject!,
    change: NSDictionary!,
    context: CMutableVoidPointer) {

        println("CHANGE OBSERVED: \(change)")
}

2
আমি যদি ভুল না হয়ে থাকি তবে অবলম্বনভালিউফোর্কিপিথ কল কলটি সুইফট 2-এর জন্য।
ফ্যাটি

9

হ্যাঁ.

কেভিওর জন্য ডায়নামিক প্রেরণ প্রয়োজন, সুতরাং আপনাকে কেবল dynamicকোনও পদ্ধতি, সম্পত্তি, সাবস্ক্রিপ্ট বা ইনিশিয়ালাইজারে সংশোধক যুক্ত করতে হবে:

dynamic var foo = 0

dynamicপরিবর্তক নিশ্চিত করে যে ঘোষণা উল্লেখ পরিবর্তনশীল প্রেষিত করা হবে এবং অ্যাক্সেস মাধ্যমে objc_msgSend


7

রব এর উত্তর ছাড়াও। এই শ্রেণিটি অবশ্যই উত্তরাধিকার সূত্রে উত্তরাধিকারী হবে NSObjectএবং সম্পত্তি পরিবর্তনের জন্য আমাদের কাছে 3 টি উপায় রয়েছে

setValue(value: AnyObject?, forKey key: String)থেকে ব্যবহার করুনNSKeyValueCoding

class MyObjectToObserve: NSObject {
    var myDate = NSDate()
    func updateDate() {
        setValue(NSDate(), forKey: "myDate")
    }
}

ব্যবহার করুন willChangeValueForKeyএবং didChangeValueForKeyথেকেNSKeyValueObserving

class MyObjectToObserve: NSObject {
    var myDate = NSDate()
    func updateDate() {
        willChangeValueForKey("myDate")
        myDate = NSDate()
        didChangeValueForKey("myDate")
    }
}

ব্যবহার dynamic। দেখুন সুইফট প্রকার সামঞ্জস্যের

আপনি যদি উদ্দেশ্য-সি রানটাইমের মাধ্যমে সদস্যদের অ্যাক্সেসকে গতিশীলভাবে প্রেরণ করাতে পারেন তবে আপনি যদি কোনও পদ্ধতির প্রয়োগকে পরিবর্তনশীলভাবে প্রতিস্থাপন করে এমন কী-মান পর্যবেক্ষণের মতো এপিআই ব্যবহার করেন তবে গতিশীল পরিবর্তনকারীও ব্যবহার করতে পারেন।

class MyObjectToObserve: NSObject {
    dynamic var myDate = NSDate()
    func updateDate() {
        myDate = NSDate()
    }
}

এবং প্রপার্টি গেটর এবং সেটার ব্যবহার করার সময় বলা হয়। কেভিওর সাথে কাজ করার সময় আপনি যাচাই করতে পারেন। এটি গণনা করা সম্পত্তির উদাহরণ

class MyObjectToObserve: NSObject {
    var backing: NSDate = NSDate()
    dynamic var myDate: NSDate {
        set {
            print("setter is called")
            backing = newValue
        }
        get {
            print("getter is called")
            return backing
        }
    }
}

5

সংক্ষিপ্ত বিবরণ

এটি ব্যবহার Combineনা করে NSObjectবা ব্যবহার করা সম্ভবObjective-C

প্রাপ্যতা: iOS 13.0+ , macOS 10.15+, tvOS 13.0+, watchOS 6.0+, Mac Catalyst 13.0+,Xcode 11.0+

দ্রষ্টব্য: মান শ্রেণীর সাথে নয় কেবল শ্রেণিতেই ব্যবহার করা দরকার।

কোড:

সুইফ্ট সংস্করণ: 5.1.2

import Combine //Combine Framework

//Needs to be a class doesn't work with struct and other value types
class Car {

    @Published var price : Int = 10
}

let car = Car()

//Option 1: Automatically Subscribes to the publisher

let cancellable1 = car.$price.sink {
    print("Option 1: value changed to \($0)")
}

//Option 2: Manually Subscribe to the publisher
//Using this option multiple subscribers can subscribe to the same publisher

let publisher = car.$price

let subscriber2 : Subscribers.Sink<Int, Never>

subscriber2 = Subscribers.Sink(receiveCompletion: { print("completion \($0)")}) {
    print("Option 2: value changed to \($0)")
}

publisher.subscribe(subscriber2)

//Assign a new value

car.price = 20

আউটপুট:

Option 1: value changed to 10
Option 2: value changed to 10
Option 1: value changed to 20
Option 2: value changed to 20

পড়ুন:


4

বর্তমানে সুইফ 'স্ব' ব্যতীত অন্য সামগ্রীর সম্পত্তি পরিবর্তন পর্যবেক্ষণের জন্য অন্তর্নির্মিত কোনও ব্যবস্থাকে সমর্থন করে না, তাই না, এটি কেভিও সমর্থন করে না।

তবে কেভিও অবজেক্টিভ-সি এবং কোকোয়ার এমন একটি মৌলিক অংশ যে এটি সম্ভবত ভবিষ্যতে যুক্ত হবে বলে মনে হয়। বর্তমান ডকুমেন্টেশন এটিকে বোঝায়:

কী-মান পর্যবেক্ষণ

তথ্য আগমন।

সুইচ ব্যবহার করে কোকো এবং অবজেক্টিভ-সি


2
স্পষ্টতই, সেই নির্দেশিকাটি আপনার রেফারেন্সে এখন সুইফটে কেভিও কীভাবে করবেন তা বর্ণনা করে।
রব

4
হ্যাঁ, এখন সেপ্টেম্বর ২০১৪ হিসাবে কার্যকর করা হয়েছে
ম্যাক্সলিয়ড

4

উল্লেখ এক গুরুত্বপূর্ণ বিষয় যে, আপনার আপডেট করার পরে হয় Xcode করতে 7 বিটা আপনি নিম্নলিখিত বার্তা পাচ্ছেন হতে পারে: "পদ্ধতি তার সুপারক্লাস থেকে কোন পদ্ধতি ওভাররাইড নেই" । যুক্তিগুলির বিকল্পতার কারণে এটি। আপনার পর্যবেক্ষণের হ্যান্ডলারটি নীচের মতো দেখতে পাবেন তা নিশ্চিত করুন:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [NSObject : AnyObject]?, context: UnsafeMutablePointer<Void>)

2
এক্সকোড বিটা 6 এ এর ​​দরকার: ওভাররাইড ফানক পর্যবেক্ষণভালিউফোর্কিকিপাথ (কীপথ: স্ট্রিং ?, অফজ অবজেক্ট: যেকোনওজেক্ট ?, পরিবর্তন: [স্ট্রিং: যেকোন অবজেক্ট] ?, প্রসঙ্গ: অনিরাপদ পরিবর্তনযোগ্য পয়েন্টার <<
নিষ্ক্রিয়

4

এটি কয়েকটি লোকের পক্ষে সহায়ক হিসাবে প্রমাণিত হতে পারে -

// MARK: - KVO

var observedPaths: [String] = []

func observeKVO(keyPath: String) {
    observedPaths.append(keyPath)
    addObserver(self, forKeyPath: keyPath, options: [.old, .new], context: nil)
}

func unObserveKVO(keyPath: String) {
    if let index = observedPaths.index(of: keyPath) {
        observedPaths.remove(at: index)
    }
    removeObserver(self, forKeyPath: keyPath)
}

func unObserveAllKVO() {
    for keyPath in observedPaths {
        removeObserver(self, forKeyPath: keyPath)
    }
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if let keyPath = keyPath {
        switch keyPath {
        case #keyPath(camera.iso):
            slider.value = camera.iso
        default:
            break
        }
    }
}

আমি সুইফ্ট 3-তে এইভাবে কেভিও ব্যবহার করেছি আপনি কয়েকটি কোড পরিবর্তন করে এই কোডটি ব্যবহার করতে পারেন।


1

ইন্টের মতো ধরণের সমস্যা নিয়ে যে কারও জন্য দৌড়ঝাঁপ? এবং সিজিফ্লোট ?. আপনি কেবল এনএসওজেক্টের একটি সাবক্লাস হিসাবে শ্রেণি নির্ধারণ করেছেন এবং আপনার ভেরিয়েবলগুলি নীচের হিসাবে ঘোষণা করেছেন:

class Theme : NSObject{

   dynamic var min_images : Int = 0
   dynamic var moreTextSize : CGFloat = 0.0

   func myMethod(){
       self.setValue(value, forKey: "\(min_images)")
   }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.