@escaping
सभी कॉलिंग विधियों के लिए संक्रामक है, और संकलक निर्धारित करता है कि में यह शामिल होना चाहिए।
इस उदाहरण पर विचार (जो संकलित):
dispatchSometime({ print("Oh yeah") })
func dispatchSometime(_ block:()->()) {
dispatchNow(block)
}
func dispatchNow(_ block:()->()) {
block()
}
यह संशोधित उदाहरण है, तथापि, प्रकार non-escaping parameter may allow it to escape
की दो त्रुटियों का उत्पादन:
dispatchSometime({ print("Oh yeah") })
func dispatchSometime(_ block:()->()) {
dispatchLater(block)
}
func dispatchLater(_ block:()->()) {
DispatchQueue.main.async(execute: block)
}
मुख्य पर प्रेषण का मतलब है dispatchLater
विधि की जरूरत है @escaping
, और एक बार जब आप इसे जोड़ देते हैं, तो dispatchSometime
विधि भीकी आवश्यकता है संकलन के उदाहरण के लिए।
dispatchSometime({ print("Oh yeah") })
func dispatchSometime(_ block: @escaping()->()) {
dispatchLater(block)
}
func dispatchLater(_ block: @escaping()->()) {
DispatchQueue.main.async(execute: block)
}
हालांकि, दूर ले बस है:
- रखें जब तक संकलक शिकायत करना बंद कर देता
@escaping
अप कॉल श्रृंखला जोड़ने।
- कीवर्ड कुछ भी नहीं बदलेगा: यह एक चेतावनी है जो कहती है, अनिवार्य रूप से, "
weak
का उपयोग कैप्चर वैरिएबल के साथ करने के लिए सावधान रहें क्योंकि उन्हें ब्लॉक के साथ ही बनाए रखा जा सकता है।"
निहितार्थ
इस के साथ वास्तव में मज़ा मामले आप @escaping
कीवर्ड है, जो शिकायत करना बंद करो करने के लिए संकलक हो जाता है शामिल करने के लिए कई तरीके समायोजित करना जहां है। हालांकि, यदि वे विधियां वास्तव में प्रोटोकॉल के अनुरूप होती हैं, तो प्रोटोकॉल के तरीकों को भी@escaping
कीवर्ड प्राप्त करें, जो अन्य सभी प्रोटोकॉल अनुरूपों को भी संक्रमित करता है। मज़ा!
स्रोत
2017-08-14 18:56:07
इसका संदर्भ लें [गैर-भागने वाले पैरामीटर का क्लोजर उपयोग इसे से बचने की अनुमति दे सकता है] (https://stackoverflow.com/q/38990882/6521116) –