मेरी समझ यह है कि सेट और प्राप्त गणना गुणों के लिए है ( संग्रहीत गुणों से कोई पीछे नहीं )
यदि आप एक उद्देश्य-सी को ध्यान में रखते हुए आ रहे हैं तो नामकरण परंपराएं बदल गई हैं। स्विफ्ट में एक iVar या उदाहरण चर को संग्रहीत संपत्ति कहा जाता है
उदाहरण 1 (केवल संपत्ति पढ़ें) - चेतावनी के साथ:
var test : Int {
get {
return test
}
}
यह एक चेतावनी के परिणामस्वरूप होगा क्योंकि यह एक पुनरावर्ती फ़ंक्शन कॉल (गेट्टर खुद को कॉल करता है) के परिणामस्वरूप होता है। इस मामले में चेतावनी "अपने ही गेट के भीतर 'परीक्षण को संशोधित करने का प्रयास" है।
उदाहरण 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
}
}
}
इसी तरह की समस्या - आप ऐसा नहीं कर सकते क्योंकि यह पुनरावर्ती रूप से सेटर को बुला रहा है। इसके अलावा, ध्यान दें कि यह कोड बिना किसी आरंभिक के बारे में शिकायत नहीं करेगा क्योंकि प्रारंभ करने के लिए कोई संग्रहीत संपत्ति नहीं है ।
उदाहरण 3. पढ़ी गई / लिखी गई संपत्ति - बैकिंग स्टोर के साथ
यहां एक पैटर्न है जो वास्तविक संग्रहीत संपत्ति की सशर्त सेटिंग की अनुमति देता है
//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
}
}
}
नोट वास्तविक डेटा _test कहलाता है (हालाँकि यह कोई भी डेटा या डेटा का संयोजन हो सकता है) नोट भी एक प्रारंभिक मूल्य प्रदान करने की आवश्यकता है (वैकल्पिक रूप से आपको एक init विधि का उपयोग करने की आवश्यकता है) क्योंकि _test वास्तव में एक उदाहरण चर है
उदाहरण 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
}
}
}
ध्यान दें कि BOTH संगणित और संग्रहीत गुणों का उपयोग करें। मैंने दो बार एक ही मूल्य निर्धारित करने से रोकने के लिए एक संगणक संपत्ति का उपयोग किया है (बुरी चीजों से बचने के लिए!); मैंने ViewControllers के लिए सूचनाओं को अग्रेषित करने के लिए .Set और didSet का उपयोग किया है (देखें UIViewController प्रलेखन और viewController कंटेनरों की जानकारी)
मुझे आशा है कि यह मदद करता है, और कृपया किसी ने चिल्लाना अगर मैंने यहाँ कहीं भी गलती की है!
get
&set
) मूल रूप से एक प्रॉपर्टी की गणना दूसरी प्रॉपर्टी के आधार पर की जाती है, जैसे कि एक लेबलtext
को एक साल में बदलनाInt
। कहने के लिएdidSet
&willSet
हैं ... हे इस मान को सेट किया गया था, अब यह करते हैं जैसे कि हमारा डेटा स्रोत अपडेट किया गया था ... तो चलिए तालिका दृश्य पुनः लोड करते हैं ताकि इसमें नई पंक्तियाँ शामिल हों। एक अन्य उदाहरण के लिए डेलिग का जवाबdidSet