সুইফটে উইলসেট এবং ডিডসেটের উদ্দেশ্য কী?


265

সি # এর মতোই সুইফ্টের একটি সম্পত্তি ঘোষণার বাক্য গঠন রয়েছে:

var foo: Int {
    get { return getFoo() }
    set { setFoo(newValue) }
}

তবে এটিরও রয়েছে willSetএবং didSetক্রিয়াও। এগুলি যথাক্রমে সেটার বলা হওয়ার পরে এবং পরে ডাকা হয়। সেটার অভ্যন্তরে আপনার কেবল একই কোড থাকতে পারে তা বিবেচনা করে তাদের উদ্দেশ্য কী?


11
আমি ব্যক্তিগতভাবে এখানে অনেক উত্তর পছন্দ করি না। তারা সিনট্যাক্সের মধ্যে অনেক নিচে যায়। পার্থক্যগুলি শব্দার্থবিজ্ঞান এবং কোড পাঠযোগ্যতা সম্পর্কে বেশি। গণিত সম্পত্তি ( get& set) মূলত অন্য কোনও সম্পত্তির উপর ভিত্তি করে একটি সম্পত্তি গণনা করা হয়, যেমন একটি লেবেলকে textএক বছরে রূপান্তর করে IntdidSet& willSetসেখানে বলার আছে ... আরে এই মানটি সেট করা হয়েছিল, এখন এটি করা যাক উদাহরণস্বরূপ আমাদের ডাটাসোর্স আপডেট করা হয়েছিল ... সুতরাং টেবিলভিউটি পুনরায় লোড করুন যাতে এটিতে নতুন সারি অন্তর্ভুক্ত থাকে। অন্য উদাহরণের জন্য ডেলিফ্রির উত্তরdidSet
হানি

উত্তর:


324

মুল বক্তব্যটি মনে হয় যে কখনও কখনও, আপনার এমন একটি সম্পত্তি প্রয়োজন যা স্বয়ংক্রিয় স্টোরেজ এবং কিছু আচরণ থাকে, উদাহরণস্বরূপ, সম্পত্তিটি কেবলমাত্র পরিবর্তিত হয়েছে এমন অন্যান্য অবজেক্টকে অবহিত করতে। আপনার সমস্ত কিছু যখন get/ তখন setআপনার মানটি ধরে রাখতে অন্য ক্ষেত্রের প্রয়োজন need সঙ্গে willSetএবং didSet, আপনি পদক্ষেপ নিতে পারি যখন মান আরেকটি ক্ষেত্র ছাড়াই রুপান্তরিত করা হয়েছে। উদাহরণস্বরূপ, সেই উদাহরণে:

class Foo {
    var myProperty: Int = 0 {
        didSet {
            print("The value of myProperty changed from \(oldValue) to \(myProperty)")
        }
    }
}

myPropertyপ্রতিবার এটি সংশোধন করা হলে এর পুরানো এবং নতুন মান মুদ্রণ করে। সবেমাত্র গেটর এবং সেটটার সহ, আমার পরিবর্তে এটির প্রয়োজন হবে:

class Foo {
    var myPropertyValue: Int = 0
    var myProperty: Int {
        get { return myPropertyValue }
        set {
            print("The value of myProperty changed from \(myPropertyValue) to \(newValue)")
            myPropertyValue = newValue
        }
    }
}

সুতরাং willSetএবং didSetকয়েক লাইনের অর্থনীতির প্রতিনিধিত্ব করুন এবং ফিল্ড তালিকায় কম শব্দ করুন।


248
দৃষ্টি আকর্ষণ: willSetএবং didSetবলা হয় না যখন আপনি অ্যাপল নোট হিসাবে একটি Init পদ্ধতি মধ্যে থেকে সম্পত্তি সেট করুন:willSet and didSet observers are not called when a property is first initialized. They are only called when the property’s value is set outside of an initialization context.
Klaas

4
এটি করার সময় তাদেরকে অ্যারে সম্পত্তি হিসাবে ডাকা হবে বলে মনে হচ্ছে: myArrayProperty.removeAtIndex(myIndex)... প্রত্যাশিত নয়।
Andreas

4
আপনি প্রাথমিককরণের মধ্যে একটি ডিফার}} স্টেটমেন্টে নিয়োগটি মোড়াতে পারেন যা ইনিশিয়েশনার স্কোপটি প্রস্থান হওয়ার পরে উইলসেট এবং ডডসেট পদ্ধতিগুলি কল করার কারণ হয়ে থাকে। আমি অগত্যা এটির সুপারিশ করছি না, কেবল এটি বলে যে এটি সম্ভব। এর একটি পরিণতি হ'ল এটি কেবলমাত্র যদি আপনি সম্পত্তিটি alচ্ছিকভাবে ঘোষণা করেন তবে এটি কাজ করে, কারণ এটি আরম্ভকারী থেকে কঠোরভাবে আরম্ভ করা হয়নি।
মারময়

লাইনের নীচে ব্যাখ্যা করুন। আমি পাচ্ছি না, এই পদ্ধতিটি বা ভেরিয়েবল ভ্যার প্রোপার্টি কি চেঞ্জডলাইস্টেনার: (ইনট, ইনট) -> শূন্য = {প্রিন্টলন ("মাইপ্রোপারটির মান ($ 0) থেকে ($ 1)")}
বিকাশ রাজপুত

একই লাইনে বৈশিষ্ট্য প্রারম্ভিক করা সুইফট 3 তে সমর্থিত নয় You আপনার সুইফ্ট 3 অনুসারে উত্তরটি পরিবর্তন করা উচিত
রমজান পোলাট

149

আমার বোধগম্যটি হ'ল সেট করা এবং গণনা করা সম্পত্তিগুলির জন্য ( সঞ্চিত বৈশিষ্ট্য থেকে কোনও ব্যাক আপ নেই )

যদি আপনি কোনও উদ্দেশ্য-সি থেকে আগত হন তবে মনে রাখবেন যে নামকরণের কনভেনশনগুলি পরিবর্তিত হয়েছে। সুইফ্টে একটি আইভার বা উদাহরণ ভেরিয়েবলের নাম রাখা হয় সঞ্চিত সম্পত্তি

উদাহরণ 1 (কেবলমাত্র সম্পত্তি পড়ুন) - সতর্কতা সহ:

var test : Int {
    get {
        return test
    }
}

এটি একটি সতর্কবার্তার ফলস্বরূপ ঘটবে কারণ এর ফলে পুনরাবৃত্তির ফাংশন কল আসে (গ্রাহক নিজে কল করে) thisএ ক্ষেত্রে সতর্কতাটি হ'ল "তার নিজের গেটারের মধ্যে 'পরীক্ষা' সংশোধন করার চেষ্টা করা হচ্ছে"।

উদাহরণ 2. শর্তসাপেক্ষে পড়ুন / লিখুন - সতর্কতা সহ

var test : Int {
    get {
        return test
    }
    set (aNewValue) {
        //I've contrived some condition on which this property can be set
        //(prevents same value being set)
        if (aNewValue != test) {
            test = aNewValue
        }
    }
}

অনুরূপ সমস্যা - এটি পুনরাবৃত্তভাবে সেটারকে কল করার কারণে আপনি এটি করতে পারবেন না । এছাড়াও, নোট করুন যে এই কোডটি কোনও আরম্ভকারীদের সম্পর্কে অভিযোগ করবে না কারণ সূচনা করার জন্য কোনও সঞ্চিত সম্পত্তি নেই

উদাহরণ ৩. গণনা করা সম্পত্তি পড়ুন / লিখুন - ব্যাকিং স্টোর সহ

এখানে এমন একটি প্যাটার্ন দেওয়া হয়েছে যা প্রকৃত সঞ্চিত সম্পত্তির শর্তসাপেক্ষে সেটিংসের অনুমতি দেয়

//True model data
var _test : Int = 0

var test : Int {
    get {
        return _test
    }
    set (aNewValue) {
        //I've contrived some condition on which this property can be set
        if (aNewValue != test) {
            _test = aNewValue
        }
    }
}

দ্রষ্টব্য প্রকৃত ডেটাটিকে _ টেস্ট বলা হয় (যদিও এটি কোনও ডেটা বা ডেটার সংমিশ্রণ হতে পারে) এছাড়াও প্রাথমিক মান সরবরাহ করার প্রয়োজনীয়তাটিও নোট করুন (বিকল্পভাবে আপনাকে একটি init পদ্ধতি ব্যবহার করা দরকার) কারণ _তাই আসলে একটি উদাহরণ পরিবর্তনশীল

উদাহরণ 4. উইল এবং সেট ব্যবহার করে

//True model data
var _test : Int = 0 {

    //First this
    willSet {
        println("Old value is \(_test), new value is \(newValue)")
    }

    //value is set

    //Finaly this
    didSet {
        println("Old value is \(oldValue), new value is \(_test)")
    }
}

var test : Int {
    get {
        return _test
    }
    set (aNewValue) {
        //I've contrived some condition on which this property can be set
        if (aNewValue != test) {
            _test = aNewValue
        }
    }
}

এখানে আমরা উইলসেট এবং ডেটসেট দেখতে পাই যা প্রকৃত সঞ্চিত সম্পত্তির পরিবর্তনকে আটকাচ্ছে। এটি বিজ্ঞপ্তিগুলি, সিঙ্ক্রোনাইজেশন ইত্যাদি প্রেরণের জন্য দরকারী (নীচে উদাহরণ দেখুন)

উদাহরণ 5. কংক্রিট উদাহরণ - ViewController কনটেইনার

//Underlying instance variable (would ideally be private)
var _childVC : UIViewController? {
    willSet {
        //REMOVE OLD VC
        println("Property will set")
        if (_childVC != nil) {
            _childVC!.willMoveToParentViewController(nil)
            self.setOverrideTraitCollection(nil, forChildViewController: _childVC)
            _childVC!.view.removeFromSuperview()
            _childVC!.removeFromParentViewController()
        }
        if (newValue) {
            self.addChildViewController(newValue)
        }

    }

    //I can't see a way to 'stop' the value being set to the same controller - hence the computed property

    didSet {
        //ADD NEW VC
        println("Property did set")
        if (_childVC) {
//                var views  = NSDictionaryOfVariableBindings(self.view)    .. NOT YET SUPPORTED (NSDictionary bridging not yet available)

            //Add subviews + constraints
            _childVC!.view.setTranslatesAutoresizingMaskIntoConstraints(false)       //For now - until I add my own constraints
            self.view.addSubview(_childVC!.view)
            let views = ["view" : _childVC!.view] as NSMutableDictionary
            let layoutOpts = NSLayoutFormatOptions(0)
            let lc1 : AnyObject[] = NSLayoutConstraint.constraintsWithVisualFormat("|[view]|",  options: layoutOpts, metrics: NSDictionary(), views: views)
            let lc2 : AnyObject[] = NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: layoutOpts, metrics: NSDictionary(), views: views)
            self.view.addConstraints(lc1)
            self.view.addConstraints(lc2)

            //Forward messages to child
            _childVC!.didMoveToParentViewController(self)
        }
    }
}


//Computed property - this is the property that must be used to prevent setting the same value twice
//unless there is another way of doing this?
var childVC : UIViewController? {
    get {
        return _childVC
    }
    set(suggestedVC) {
        if (suggestedVC != _childVC) {
            _childVC = suggestedVC
        }
    }
}

দুটি গণিত এবং সঞ্চিত বৈশিষ্ট্য ব্যবহার নোট করুন। দু'বার একই মান সেট করা থেকে বিরত রাখতে আমি একটি গণিত সম্পত্তি ব্যবহার করেছি (খারাপ জিনিস যাতে না ঘটে সে জন্য!); আমি ভিউ কনট্রোলারগুলিতে বিজ্ঞপ্তি ফরোয়ার্ড করতে উইলসেট এবং ডুডসেট ব্যবহার করেছি (দেখুন ইউআইভিউউকন্ট্রোলার ডকুমেন্টেশন এবং ভিউকন্ট্রোলার ধারকগুলিতে তথ্য)

আমি আশা করি এটি সাহায্য করে, এবং দয়া করে কেউ এখানে চিত্কার করে যদি আমি কোথাও কোনও ভুল করে থাকি!


3
কেন আমি ব্যবহার করতে পারি না এবং কীভাবে ব্যবহার করতে পারি?
বেন সিনক্লেয়ার

//I can't see a way to 'stop' the value being set to the same controller - hence the computed property আমি if let newViewController = _childVC { পরিবর্তে সতর্কতা if (_childVC) {
অদৃশ্য

5
গেট এবং সেট একটি গণিত সম্পত্তি তৈরি করতে ব্যবহৃত হয়। এগুলি খাঁটি পদ্ধতি, এবং কোনও ব্যাকিং স্টোরেজ নেই (উদাহরণ পরিবর্তনশীল)। উইলসেট এবং ডিডসেট হ'ল সঞ্চিত ভেরিয়েবল বৈশিষ্ট্যগুলিতে পরিবর্তনগুলি পর্যবেক্ষণ করার জন্য। ফণা অধীনে, এগুলি স্টোরেজ দ্বারা ব্যাক করা হয়, কিন্তু সুইফ্টে এটি সমস্ত এক হয়ে যায়।
ব্যবহারকারী 3675131

আপনার উদাহরণ 5, ইন get, আমি আপনাকে if _childVC == nil { _childVC = something }এবং তারপর যোগ করা প্রয়োজন মনে করি return _childVC
JW.ZG

18

এগুলিকে সম্পত্তি পর্যবেক্ষক বলা হয় :

সম্পত্তি পর্যবেক্ষকরা কোনও সম্পত্তির মান পরিবর্তনের বিষয়ে পর্যবেক্ষণ এবং প্রতিক্রিয়া জানান। সম্পত্তির পর্যবেক্ষকরা যখনই কোনও সম্পত্তির মান সেট করা হয় তখনই তাকে বলা হয়, এমনকি যদি নতুন মান সম্পত্তির বর্তমান মানের হিসাবে একই হয়।

এর উত্স: অ্যাপল ইনক। "দ্য সুইফ্ট প্রোগ্রামিং ভাষা।" iBooks। https://itun.es/ca/jEUH0.l

আমি সন্দেহ করি যে কেভিওর সাথে আমরা tradition তিহ্যগতভাবে কিছু করব যেমন ইউআই উপাদানগুলির সাথে ডেটা বাঁধাই করা, বা কোনও সম্পত্তি পরিবর্তনের পার্শ্ব প্রতিক্রিয়া ট্রিগার করা, একটি সিঙ্ক প্রক্রিয়া, ব্যাকগ্রাউন্ড প্রসেসিং ইত্যাদি ইত্যাদির জন্য এটি করার অনুমতি দেয় I


16

বিঃদ্রঃ

willSetএবং didSetপ্রতিনিধিরা স্থান গ্রহণের আগে কোনও প্রারম্ভিক ব্যবস্থায় কোনও সম্পত্তি সেট করা হলে পর্যবেক্ষকদের ডাকা হয় না


16

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

let minValue = 1

var value = 1 {
    didSet {
        if value < minValue {
            value = minValue
        }
    }
}

value = -10 // value is minValue now.

10

অনেকগুলি লিখিত বিদ্যমান উত্তরগুলি প্রশ্নটি ভালভাবে কভার করে, তবে আমি কিছুটা বিশদে উল্লেখ করব, একটি সংযোজন যা আমি বিশ্বাস করি যে এটি আচ্ছাদনযোগ্য।


willSetএবং didSetসম্পত্তি পর্যবেক্ষক প্রতিনিধিদের, যেমন, বর্গ বৈশিষ্ট্য যে শুধুমাত্র কখনও ব্যবহারকারীর কোনো ভূমিকা দ্বারা আপডেট করা হয় জন্য কল করার জন্য ব্যবহার করা যেতে পারে, কিন্তু যেখানে আপনি বস্তুর আরম্ভের সময়ে প্রতিনিধি কলিং এড়াতে চান।

আমি গ্রহণযোগ্য উত্তরে ক্লাসকে আপ-ভোট দেওয়া মন্তব্যটি উদ্ধৃত করব:

যখন কোনও সম্পত্তি প্রথম শুরু করা হয় তখন উইলসেট এবং ডেটসেট পর্যবেক্ষকদের ডাকা হয় না। এগুলি তখনই ডাকা হয় যখন সম্পত্তির মান সূচনা প্রসঙ্গে বাইরে সেট করা থাকে।

এটি বেশ ঝরঝরে এটির অর্থ যেমন didSetসম্পত্তিটি আপনার নিজস্ব কাস্টম ক্লাসের জন্য ডেলিগেট কলব্যাকস এবং ফাংশনগুলির জন্য লঞ্চ পয়েন্টের একটি ভাল পছন্দ।

উদাহরণ হিসাবে, কিছু কী সম্পত্তি value(উদাহরণস্বরূপ রেটিং নিয়ন্ত্রণে অবস্থান) সহ কিছু কাস্টম ব্যবহারকারী নিয়ন্ত্রণ বস্তু বিবেচনা করুন, এর সাবক্লাস হিসাবে প্রয়োগ করা হয়েছে UIView:

// CustomUserControl.swift
protocol CustomUserControlDelegate {
    func didChangeValue(value: Int)
    // func didChangeValue(newValue: Int, oldValue: Int)
    // func didChangeValue(customUserControl: CustomUserControl)
    // ... other more sophisticated delegate functions
}

class CustomUserControl: UIView {

    // Properties
    // ...
    private var value = 0 {
        didSet {
            // Possibly do something ...

            // Call delegate.
            delegate?.didChangeValue(value)
            // delegate?.didChangeValue(value, oldValue: oldValue)
            // delegate?.didChangeValue(self)
        }
    }

    var delegate: CustomUserControlDelegate?

    // Initialization
    required init?(...) { 
        // Initialise something ...

        // E.g. 'value = 1' would not call didSet at this point
    }

    // ... some methods/actions associated with your user control.
}

যার পরে আপনার প্রতিনিধি ফাংশনগুলি ব্যবহার করতে পারেন, বলুন, কিছু ভিউ কন্ট্রোলারের জন্য মডেলটির মূল পরিবর্তনগুলি পর্যবেক্ষণ CustomViewControllerকরতে পারেন, যেমন আপনি বস্তুর (যেমন ) UITextFieldDelegateজন্য সহজাত প্রতিনিধি ফাংশন ব্যবহার করতে চান useUITextFieldtextFieldDidEndEditing(...)

এই সাধারণ উদাহরণের জন্য, didSetশ্রেণীর সম্পত্তি থেকে একটি প্রতিনিধি কলব্যাক ব্যবহার করুন এমন valueকোনও ভিউ কন্ট্রোলারকে জানানোর জন্য যে এর কোনও একটির সাথে সম্পর্কিত রয়েছে মডেল আপডেট:

// ViewController.swift
Import UIKit
// ...

class ViewController: UIViewController, CustomUserControlDelegate {

    // Properties
    // ...
    @IBOutlet weak var customUserControl: CustomUserControl!

    override func viewDidLoad() {
        super.viewDidLoad()
        // ...

        // Custom user control, handle through delegate callbacks.
        customUserControl = self
    }

    // ...

    // CustomUserControlDelegate
    func didChangeValue(value: Int) {
        // do some stuff with 'value' ...
    }

    // func didChangeValue(newValue: Int, oldValue: Int) {
        // do some stuff with new as well as old 'value' ...
        // custom transitions? :)
    //}

    //func didChangeValue(customUserControl: CustomUserControl) {
    //    // Do more advanced stuff ...
    //}
}

এখানে, valueসম্পত্তিটি এনক্যাপসুলেটেড করা হয়েছে, তবে সাধারণত: এইরকম পরিস্থিতিতে ভিউ কন্ট্রোলারে সম্পর্কিত প্রতিনিধি ফাংশনের সুযোগ (এখানে :) অবজেক্টের valueসম্পত্তি আপডেট না করার বিষয়ে সতর্ক থাকুন বা আপনি এটি শেষ করবেন না you'll অসীম পুনরাবৃত্তি।customUserControldidChangeValue()


4

সম্পত্তি যখনই কোনও নতুন মান নির্ধারিত হয় তখন সম্পত্তিগুলির জন্য উইলসেট এবং ডেটসেট পর্যবেক্ষকগণ। নতুন মান বর্তমান মানের সমান হলেও এটি সত্য।

এবং নোট করুন যে willSetঅন্যদিকে কাজ করার জন্য একটি প্যারামিটার নাম প্রয়োজন, এটি didSetকরেন না।

সম্পত্তি মান আপডেট হওয়ার পরে ডডসেট পর্যবেক্ষককে ডাকা হয় called এটি পুরানো মানের সাথে তুলনা করে। যদি মোট পদক্ষেপের সংখ্যা বৃদ্ধি পেয়েছে তবে কতগুলি নতুন পদক্ষেপ নেওয়া হয়েছে তা বোঝাতে একটি বার্তা মুদ্রিত হয়। ডিডসেট পর্যবেক্ষক পুরানো মানটির জন্য কোনও কাস্টম প্যারামিটারের নাম সরবরাহ করে না এবং পরিবর্তে ওল্ডভ্যালুর ডিফল্ট নামটি ব্যবহৃত হয়।


2

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


1
আপনি কি বলছেন যে সমতুল্য সেটার কোড ব্যবহার করে এবং বনামের কার্যকারিতা রয়েছে ? এটি একটি সাহসী দাবি বলে মনে হচ্ছে। willSetdidSet
জিনাক

1
@ zneak আমি ভুল শব্দ ব্যবহার করেছি। আমি প্রোগ্রামার প্রচেষ্টা দাবি করছি, প্রক্রিয়াকরণ ব্যয় নয়।
ইওনিল

1

আপনার নিজস্ব (বেস) শ্রেণিতে, willSetএবং didSetবেশ হ্রাসকারী , কারণ আপনি পরিবর্তে একটি গণনা করা সম্পত্তি ( অর্থাত্- এবং সেট-পদ্ধতিগুলি) সংজ্ঞায়িত করতে পারেন যা _propertyVariableকোনও অ্যাক্সেস করে এবং পছন্দসই প্রাক-এবং প্রাক-মূল্যায়ন করতে পারে

পারেন, তবে , আপনি একটি বর্গ যেখানে সম্পত্তি ওভাররাইড ইতিমধ্যে সংজ্ঞায়িত , তারপরwillSet এবং didSetহয় দরকারী এবং অপ্রয়োজনীয় নয়!


1

didSetআপনি অতিরিক্ত কনফিগারেশন যুক্ত করতে আউটলেটগুলি ব্যবহার করার সময় একটি জিনিস সত্যই কার্যকর হয়।

@IBOutlet weak var loginOrSignupButton: UIButton! {
  didSet {
        let title = NSLocalizedString("signup_required_button")
        loginOrSignupButton.setTitle(title, for: .normal)
        loginOrSignupButton.setTitle(title, for: .highlighted)
  }

বা উইলসেট ব্যবহার করে এই আউটলেট পদ্ধতিগুলিতে কিছু প্রভাব ফেলতে পারে, তাই না?
এলিয়া

-5

আমি সি # জানি না, তবে একটু অনুমানের সাথে আমি মনে করি আমি কী বুঝতে পারি

foo : int {
    get { return getFoo(); }
    set { setFoo(newValue); }
}

আছে। এটি আপনার সুইফটে যা আছে তার সাথে দেখতে অনেকটা মিল, তবে এটি একই নয়: সুইফটে আপনার কাছে getFooএবং নেই setFoo। এটি সামান্য পার্থক্য নয়: এর অর্থ হল আপনার মানটির জন্য আপনার কোনও অন্তর্নিহিত স্টোরেজ নেই।

সুইফ্টে গুটি গুটি গুটি রাখা হয়েছে।

একটি গণিত সম্পত্তি রয়েছে getএবং থাকতে পারে set(যদি এটি লিখিত হয়)। তবে গিটার এবং সেটারের কোডগুলি, যদি তাদের আসলে কিছু ডেটা সঞ্চয় করতে হয় তবে অবশ্যই এটি অন্যান্য বৈশিষ্ট্যে করা উচিত। কোনও ব্যাকিং স্টোরেজ নেই।

অন্যদিকে, একটি সঞ্চিত সম্পত্তিটির ব্যাকিং স্টোরেজ রয়েছে। কিন্তু এটা না না আছে getএবং set। পরিবর্তে এটির রয়েছে willSetএবং didSetযা আপনি পরিবর্তনশীল পরিবর্তনগুলি পর্যবেক্ষণ করতে এবং অবশেষে, পার্শ্ব প্রতিক্রিয়াগুলি ট্রিগার করতে এবং / বা সঞ্চিত মানটি সংশোধন করতে পারেন। আপনার কাছে willSetএবং didSetগণনা করা বৈশিষ্ট্য নেই, এবং আপনার সেগুলির দরকার নেই কারণ গণনা করা বৈশিষ্ট্যের জন্য আপনি setপরিবর্তনগুলি নিয়ন্ত্রণ করতে কোডটি ব্যবহার করতে পারেন ।


এটি সুইফ্ট উদাহরণ example getFooএবং setFooআপনি যাঁরা এবং সেটটারগুলি করতে চান তার জন্য সাধারণ স্থানধারক। সি # তাদেরও দরকার নেই। (
সংকলকটিতে

1
ওহ ঠিক আছে. তবে গুরুত্বপূর্ণ বিষয়টি হ'ল কোনও গণিত সম্পত্তিটির অন্তর্নিহিত স্টোরেজ থাকে না। আমার অন্যান্য উত্তরটিও
অ্যানালগ ফাইল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.