मुझे पता चला कि स्विफ्ट क्लोजर मेरी अपेक्षा के विपरीत कैप्चर किए गए चर को बरकरार नहीं रख रहे हैं।क्या स्विफ्ट क्लोजर कैप्चर वैरिएबल बनाए रखता है?
class AAA {
}
var a1 = AAA() as AAA? // expects RC == 1
var a2 = {()->AAA? in return a1 } // expects RC == 2, retained by `Optional<AAA>`
a1 = nil // expects RC == 1
a2() // prints nil, ????
मैं इस से बहुत उलझन में हूं क्योंकि मुझे विश्वास है कि कब्जे वाले चर डिफ़ॉल्ट रूप से बनाए रखा जाएगा। लेकिन, अगर मैं इसे कैप्चरिंग सूची का उपयोग करके स्पष्ट रूप से कैप्चर करता हूं, तो इसे बरकरार रखा जा रहा है।
class AAA {
}
var a1 = AAA() as AAA?
var a2 = { [a1]()->AAA? in return a1 }
a1 = nil
a2() // prints {AAA}, alive as expected.
मैंने स्विफ्ट मैनुअल को फिर से पढ़ा, लेकिन मुझे संबंधित विवरण नहीं मिला। कैप्चरिंग सूची का उपयोग unowned
को स्पष्ट रूप से सेट करने के लिए किया जाता है, और मैं अभी भी उलझन में हूं। सही व्यवहार क्या है और यह क्यों होता है?
सच नहीं है। उदाहरण के लिए, 'func test() {var x = 42; चलो f = {println (x)}; एक्स = 43; एफ()}; परीक्षण() 'प्रिंट '43', जिसका अर्थ है कि क्लोजर संदर्भ द्वारा परिवर्तनीय को कैप्चर करता है, भले ही यह इसे संशोधित किए बिना चर का संदर्भ देता है। – newacct
धन्यवाद @ न्यूवेक्ट। यद्यपि मैंने जो लिखा है, वह स्पष्ट रूप से नहीं कह रहा है, प्रलेखन ने मुझे लगता है कि यह इस तरह से काम करता है। – Antonio
क्या संदर्भ के द्वारा संकलक को पकड़ने के लिए मजबूर करने का कोई तरीका है? मेरे पास एक ऐसा मामला है जहां मेरे पास साझा मूल्य तक पहुंचने का प्रयास करने वाले दो बंद हैं। एक बंद कैप्चर किए गए मान को संशोधित करता है और दूसरा इसे केवल पढ़ता है। हालांकि, जो इसे पढ़ता है वह एक प्रति प्राप्त कर रहा है। मुझे इसे संदर्भ द्वारा कैप्चर करने के लिए मजबूर करने की आवश्यकता है। –