Swift Language
द डेफर स्टेटमेंट
खोज…
जब एक defer स्टेटमेंट का उपयोग करना है
defer
स्टेटमेंट में कोड का एक ब्लॉक होता है, जिसे फंक्शन लौटने पर निष्पादित किया जाएगा और सफाई के लिए उपयोग किया जाना चाहिए।
चूंकि स्विफ्ट के guard
स्टेटमेंट शुरुआती रिटर्न की शैली को प्रोत्साहित करते हैं, इसलिए रिटर्न के लिए कई संभावित रास्ते मौजूद हो सकते हैं। एक defer
स्टेटमेंट सफाई कोड प्रदान करता है, जिसे तब हर बार दोहराने की आवश्यकता नहीं होती है।
यह डिबगिंग और प्रोफाइलिंग के दौरान भी समय बचा सकता है, क्योंकि मेमोरी लीक और अप्रयुक्त खुले संसाधनों के कारण भूल गए सफाई से बचा जा सकता है।
यह एक समारोह के अंत में एक बफर से निपटने के लिए इस्तेमाल किया जा सकता है:
func doSomething() {
let data = UnsafeMutablePointer<UInt8>(allocatingCapacity: 42)
// this pointer would not be released when the function returns
// so we add a defer-statement
defer {
data.deallocateCapacity(42)
}
// it will be executed when the function returns.
guard condition else {
return /* will execute defer-block */
}
} // The defer-block will also be executed on the end of the function.
किसी फ़ंक्शन के अंत में संसाधनों को बंद करने के लिए भी इसका उपयोग किया जा सकता है:
func write(data: UnsafePointer<UInt8>, dataLength: Int) throws {
var stream:NSOutputStream = getOutputStream()
defer {
stream.close()
}
let written = stream.write(data, maxLength: dataLength)
guard written >= 0 else {
throw stream.streamError! /* will execute defer-block */
}
} // the defer-block will also be executed on the end of the function
जब एक defer स्टेटमेंट का उपयोग नहीं करना है
डिफर-स्टेटमेंट का उपयोग करते समय, सुनिश्चित करें कि कोड पठनीय बना रहे और निष्पादन क्रम स्पष्ट रहे। उदाहरण के लिए, डिफर-स्टेटमेंट का निम्नलिखित उपयोग निष्पादन आदेश और कोड के फ़ंक्शन को समझने में कठिन बनाता है।
postfix func ++ (inout value: Int) -> Int {
defer { value += 1 } // do NOT do this!
return value
}