सबसे पहले: defer
निष्पादित हो जाता है क्योंकि आप इसे print(str)
जोड़ते समय स्पष्ट रूप से देख सकते हैं।
अब समझाने के लिए क्यों दिए गए मान बदली हुई मूल्य को प्रतिबिंबित नहीं करता:
इस का कारण यह है कि String
अपरिवर्तनीय है - जब भी आप str += something
बारे में आप पूरी तरह से नया String
उदाहरण बना सकते हैं और str
अंदर यह दुकान।
यदि आप return str
लिखते हैं जो str
का वर्तमान उदाहरण देता है जो 123yyy4
है। फिर defer
को पूरी तरह से नया और असंबंधित String
123yyy4xxx
str
असाइन किया जाता है। लेकिन str
के अंदर संग्रहीत पिछले String
ऑब्जेक्ट को नहीं बदलेगा, यह बस इसे ओवरराइट करता है और इसलिए return
को प्रभावित नहीं करता है जो पहले से ही "हुआ" है।
आप NSMutableString
का उपयोग करने के बजाय आप हमेशा ही उदाहरण पर कार्यवाही करेंगे अपनी प्रक्रिया बदल देते हैं और परिणाम होगा इसलिए सही ढंग से उत्पादन 123yyy4xxx
:
func branch() -> NSMutableString {
var str = NSMutableString()
defer { str.appendString("xxx") }
str.appendString("1")
let counter = 3;
if counter > 0 {
str.appendString("2")
defer { str.appendString("yyy") }
str.appendString("3")
}
str.appendString("4")
return str
}
let bran1 = branch()
कि कोड में वापसी str
में संग्रहीत उदाहरण देता है और defer बदलता है कि उदाहरण, यह एक नया उदाहरण असाइन नहीं करता है लेकिन पहले से मौजूद एक को बदलता है।
इसे बदलने के बाद
defer
ब्लॉक में
str
बदलने से पहले
NSMutableString
के लिए सभी तीन मामलों में एक ही स्मृति पता अर्थ होगा जी कि उदाहरण वही रहता है। String
एक हालांकि दो अलग-अलग मेमोरी पतों को प्रिंट करता है जिसके परिणामस्वरूप लौटा हुआ स्ट्रिंग someAddress
पर इंगित करता है और स्थगित एक someOtherAddress
पर इंगित करता है।
यह काम करता है लेकिन 'defer' शुरू हो जाती है _after_ गुंजाइश पहले बाहर चलाता है इसलिए 'रिटर्न स्ट्र' को तब कॉल किया जाता है जब दायरा समाप्त हो जाता है और यह आपके 'डिफियर' को कॉल करता है और स्थानीय उदाहरण में 'xxx "' जोड़ता है जो _after_ मान रिटर्न होता है। – holex