2016-06-30 10 views
13

का उपयोग कर रहा, कुछ है कि वास्तव में मुझे पहेली है instantiating विशेष रूप से निम्नलिखित कोड एक संकलक त्रुटि से चलाता है "अनसुलझे पहचानकर्ता स्व", और मैं के रूप में आलसी का मतलब है, यकीन है कि क्यों यह हो रहा है नहीं कर रहा हूँ उस समय संपत्ति होगा इस्तेमाल किया जाना चाहिए, कक्षा पहले से ही तत्काल है। क्या मैं कुछ भूल रहा हूँ?स्विफ्ट आलसी स्वयं

अग्रिम में बहुत धन्यवाद। अगर इसके प्रारंभिक मूल्य self को संदर्भित करता है

यहाँ कोड

class FirstClass { 
    unowned var second: SecondClass 

    init(second:SecondClass) { 
     self.second = second 
     print("First reporting for duty") 
    } 

    func aMethod() { 
     print("First's method reporting for duty") 
    } 
} 


class SecondClass { 

    lazy var first = FirstClass(second: self) 

    func aMethod() { 
     first.aMethod() 
    } 
} 
+0

यह वास्तव में क्या करना है? अपने 'द्वितीय क्लास' में 'फर्स्ट क्लास' से 'एमेथ' को कॉल करें? – Dershowitz123

+0

नहीं, बस आलसी इसे तुरंत चालू करें, विधियों को अनदेखा करें –

उत्तर

18

किसी कारण से, एक आलसी संपत्ति एक स्पष्ट प्रकार एनोटेशन की जरूरत है। यह swift-evolution mailing list पर उल्लेख किया गया है, फिर भी मैं क्यों कि है आवश्यक व्याख्या नहीं कर सकते।

lazy var first: FirstClass = FirstClass(second: self) 
//   ^^^^^^^^^^^^ 

अपने कोड के साथ संकलित करता है तथा अपेक्षा के अनुरूप चलाता है।

यहाँ, एक और उदाहरण है जो यह दर्शाता है कि समस्या तब होती है भी struct साथ है यानी यह उपवर्गीकरण से संबंधित नहीं है:

func foo(x: Int) -> Int { return x + 1 } 

struct MyClass { 
    let x = 1 

    lazy var y = foo(0)   // No compiler error 
    lazy var z1 = foo(self.x)  // error: use of unresolved identifier 'self' 
    lazy var z2: Int = foo(self.x) // No compiler error 
} 

y का प्रारंभिक मूल्य self पर निर्भर नहीं करता है और एक की जरूरत नहीं है एनोटेशन टाइप करें। z1/z2 के शुरुआती मान self, पर निर्भर करते हैं और यह केवल एक स्पष्ट प्रकार की एनोटेशन के साथ संकलित करता है।

अद्यतन: स्विफ्ट 4 में यह has been fixed/Xcode 9 बीटा 3, आलसी संपत्ति initializers अब बिना स्पष्ट self उदाहरण सदस्यों संदर्भित कर सकते हैं, और स्पष्ट प्रकार एनोटेशन के बिना। (अद्यतन के लिए @hamish के लिए धन्यवाद।)

+0

W.r.t. "कुछ कारण": 'self' प्रकार' सेकेंड क्लास 'या' सेकेंड क्लास 'का सबक्लास प्रकार हो सकता है। इसका मतलब है कि 'स्वयं' की कुछ विधि का रिटर्न प्रकार रनटाइम पर भिन्न हो सकता है, जो कक्षा पदानुक्रम में 'स्वयं' क्या है। अगर हम इस तरह के क्लास विधि के रिटर्न वैल्यू का उपयोग आलसी रूप से 'पहले' को तत्काल करने के लिए करते थे, तो हम समय को 'पहले' के प्रकार संकलित करने के बारे में नहीं जानते थे (सबक्लस में अधिभार वापसी प्रकार के कारण), इसलिए स्पष्ट करने की आवश्यकता 'पहले' की एनोटेशन टाइप करें। अब, प्रारंभकर्ता के लिए तर्क के रूप में 'self' का उपयोग करते समय यह कोई समस्या नहीं होनी चाहिए, लेकिन संभवतः उपरोक्त मामला सामान्यीकृत करता है। – dfri

+0

(जहां से _ _ मैं इस मामले में जहां उपवर्ग एक ही विधि मापदंडों लेकिन अलग वापसी प्रकार के साथ एक नया ही नाम विधि का परिचय का उल्लेख "कुछ विधि' self' कार्यावधि में अलग हो सकता है की वापसी प्रकार ", में एक अस्पष्ट विधि पसंद उपज मामला 'स्वयं' एक सबक्लास ऑब्जेक्ट है और यदि आलसी चर को स्पष्ट रूप से एनोटेटेड टाइप नहीं किया गया था। हालांकि, यह अजीब बात है कि संकलक प्रकार का अनुमान नहीं लगा सकता है जैसे आपूर्ति किए गए स्पष्ट रिटर्न प्रकार से आलसी को तुरंत बंद करने के लिए बंद करना var, उदाहरण के लिए 'आलसी var first = {() -> फर्स्ट क्लास फर्स्ट क्लास (दूसरा: स्वयं)}() ')। – dfri

+0

@dfri: आपकी प्रतिक्रिया के लिए धन्यवाद। हालांकि, समस्या उपclassing से असंबंधित प्रतीत होता है, मैंने एक उदाहरण जोड़ा है। –

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