2016-03-27 5 views
6

मैं स्विफ्ट प्रोग्रामिंग भाषा मैनुअल पढ़ रहा हूं और यह एक भागने बंद करने का उल्लेख करता है। बंद होने से बचने के संबंध में, मुझे नहीं पता कि उनका मतलब क्या है "बंद करने के लिए कार्य को तर्क के रूप में पारित किया जाता है, लेकिन फ़ंक्शन रिटर्न के बाद कहा जाता है।" क्या कोई बंद होने से बचने पर एक उदाहरण प्रदान कर सकता है?स्विफ्ट में एक बच निकलने का एक अच्छा उदाहरण क्या है?

उत्तर

2

एक भागने बंद का एक उदाहरण कुछ अतुल्यकालिक कार्य में, इस तरह के एक नेटवर्क अनुरोध भेजने के रूप में पूरा होने हैंडलर होगा:

func performRequest(parameters: [String: String], completionHandler: (NSData?, NSError?) ->()) { 
    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(parameters, options: []) 
    request.setValue("application/json", forHTTPHeaderField: "Content-Type") 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     completionHandler(data, error) 
    } 
    task.resume() 
} 

और यह इसलिए की तरह कहा जाता है:

performRequest(["foo" : "bar"]) { data, error in 
    guard error == nil else { 
     print(error) 
     return 
    } 

    // now use data here 
} 

// Note: The `completionHandler` above runs asynchronously, so we 
// get here before the closure is called, so don't try to do anything 
// here with `data` or `error`. Any processing of those two variables 
// must be put _inside_ the closure above. 

यह completionHandler बंद होने से बचने के लिए माना जाता है क्योंकि NSURLSession विधि dataTaskWithRequest असीमित रूप से चलाता है (यानी यह तुरंत लौटाता है और अनुरोध समाप्त होने पर बाद में बंद हो जाएगा)।

2

स्विफ्ट में 3 बंद पैरामीटर डिफ़ॉल्ट रूप से गैर-भागने बन जाते हैं।

हमें पैरामीटर रिटर्न के बाद बंद करने के लिए पैरामीटर प्रकार को इंगित करने के लिए पैरामीटर प्रकार से पहले @escaping बंद करने की विशेषता लिखनी होगी।

typealias Operation = (Data?) ->() 

func addToQueue(data: Data?, operation: @escaping Operation) { 
    OperationQueue.main.addOperation { 
     operation(data) 
    } 
} 

अगर हम @escaping विशेषता निकालने के लिए, Xcode

non-escaping parameter error message

+0

काफी स्पष्ट उत्तर नीचे त्रुटि संदेश दिखाई देगा, समझने के लिए जहाँ मेरा मुद्दा था मदद की। मेरे पास 3-4 लेवल क्लोजर थे, इसलिए यह समझना मुश्किल था कि वास्तव में '@ एस्केपिंग' कहाँ रखा जाना चाहिए। – Jonauz

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

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