2015-03-30 8 views
5

मैं स्विफ्ट के साथ नया हूं और भाषा के साथ खेल रहा हूं। मैंने संकलित चर और परिवर्तनीय पर्यवेक्षक की अवधारणा सीखी है। मैं जानना चाहता हूं कि एक ही समय में दोनों को परिभाषित करना संभव है जब मैं एक चर परिभाषित करता हूं। मैंने कोशिश की लेकिन असफल रहा। नीचे मेरा कोड है (काम नहीं कर रहा है!)।स्विफ्ट भाषा: पर्यवेक्षक के साथ एक गणना चर को परिभाषित करने के लिए कैसे?

var a:Int = 88 
{ 
    get 
    { 
     println("get...") 
     return 77 
    } 

    set 
    { 
     a = newValue + 1 
    } 
} 
{ 
    willSet 
    { 
     println("In willSet") 
     println("Will set a to \(newValue)") 
     println("Out willSet") 
    } 

    didSet 
    { 
     println("In didSet") 
     println("Old value of a is \(oldValue)") 
     println(a) 
     if(a % 2 != 0) 
     { 
      a++ 
     } 
     println("Out didSet") 
    } 
} 

println(a) 
a = 99 

println(a) 

मैं जानना चाहता हूं, क्या यह संभव है? धन्यवाद।

+0

उपर्युक्त संकलित नहीं होगा - गलत जगहें। – GoZoner

उत्तर

3

यह नहीं किया जा सकता:

Welcome to Swift version 1.2. Type :help for assistance. 
    1> class Foo { 
    2.  var bar : Int { 
    3.   get { return 1 } 
    4.   willSet { println ("will") } 
    5.  } 
    6. }  
repl.swift:3:9: error: willSet variable may not also have a get specifier 
     get { return 1 } 
     ^

त्रुटि संदेश का वर्णन करता है क्यों।

1

मुझे लगता है कि संपत्ति पर्यवेक्षकों को केवल संग्रहीत गुणों पर ही लागू किया जा सकता है। गणना गुण और संपत्ति पर्यवेक्षक इस अर्थ में समान हैं कि दोनों को संपत्ति के मूल्य में परिवर्तन के समय कहा जाता है और हम गणना पर्यवेक्षकों को संपत्ति पर्यवेक्षकों के रूप में भी देख सकते हैं

तो, मुझे नहीं लगता कि हम एक गणना किए गए चर को परिभाषित कर सकते हैं देखने वाला।

6

संक्षिप्त उत्तर, यह संभव नहीं है।

मुझे लगता है कि गणना गुणों और संग्रहीत गुणों का विचार काफी विशिष्ट है।

संग्रहीत गुणों के बारे में बात करते हुए, इस बारे में सोचने के लिए सदस्य चर के रूप में सोचें कि उन्हें कब सेट किया गया है या असाइन किया गया है। उन्हें संग्रहीत नहीं किया जाता है और इसलिए उन्हें एक मूल्य आवंटित किया जा सकता है और कक्षा को परिभाषित करने के बाहर अन्य वर्ग या विधियों द्वारा निर्धारित या असाइन किया जा सकता है।

गणना की गई संपत्तियों के मामले में उन्हें हर बार गणना की जाती है और इसलिए उन्हें संग्रहीत नहीं किया जाता है। मुझे लगता है कि सेटिंग का विचार भी गणना गुणों के अनुरूप नहीं है क्योंकि यदि आप इसे सेट करते हैं तो इसकी गणना नहीं की जाती है।

किसी संपत्ति में सेटटर के मामले में, आपको पता है कि इसे कब सेट किया जा रहा है या असाइन किया गया है और इसलिए इच्छा की आवश्यकता नहीं है या किया गया है।

var myProp: String { 
    set { 
     //You know it is being set here. :-) 
     //No need of an event to tell you that! 
    } 
} 
1

गणना की गई संपत्तियों के लिए, पर्यवेक्षक वास्तव में अधिक नहीं जोड़ पाएंगे। यह बहुत की तरह सेट समारोह में बराबर करने के लिए आसान है:

set { 
    // do willSet logic here 
    let oldValue = a 

    a = newValue + 1 

    // do didSet logic here 
} 

तो willSet या didSet तर्क जटिल है, आप इसे बाहर इस तरह के willSetA या didSetA के रूप में सदस्य कार्यों में refactor कर सकते हैं।

संबंधित मुद्दे