2014-10-04 18 views
15

स्विफ्ट में खाली बंद करने के लिए सुरुचिपूर्ण तरीका, मुझे अक्सर विधि के अपेक्षित पैरामीटर (धैर्य) का अनुपालन करने के लिए विधि के लिए एक नोप क्लोजर पास करना होगा। ओबज सी के अच्छे पुराने दिनों में, कोई नोप कॉलबैक के लिए nil पास कर सकता है और इसके साथ किया जा सकता है। स्विफ्ट में ऐसा करने के लिए एक खाली ब्लॉक पास किए बिना ऐसा करने का एक और अधिक शानदार तरीका है?स्विफ्ट

UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: { (UIAlertAction) -> Void in }) // do nothing in callback

पूरा उदाहरण:

import UIKit 

class UIAlertControllerFactory { 
    class func ok(title: String, message: String) -> UIAlertController { 
     var alertController = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert) 
     var okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: { (UIAlertAction) -> Void in 
     }) 
     alertController.addAction(okAction) 
     return alertController 
    } 
} 

उत्तर

26

सामान्य तरह से, आप nil पारित नहीं हो सकता है, तो:

var okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, 
    handler:{ _ in }) 

तुम भी इस मामले में nil गुजरती हैं, क्योंकि (जैसा कि कर सकते हैं आईओएस 9.0 का) हैंडलर Optional है:

var okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, 
    handler:nil) 
+0

मैं कसम खाई नहीं के बराबर काम नहीं किया बीटा में से एक में। धन्यवाद, मुझे _ दृष्टिकोण भी पसंद है। – dimroc

+2

'हैंडलर' प्रकार का है' ((UIAlertAction!) -> शून्य)! ', इसका मतलब क्या है कि यह एक लागू रूप से अनचाहे वैकल्पिक है। यही कारण है कि आप इस पैरामीटर के लिए 'शून्य' पास कर सकते हैं। यह दस्तावेज है (अधिक जानकारी के लिए मेरा जवाब देखें)। –

+0

ए '!' प्रत्यय का अर्थ है 'लागू रूप से अनप्राप्डऑप्शनल', जो ऐप्पल ज्यादातर (एपीआई में) का उपयोग करता है इसका मतलब यह है कि उन्होंने जांच नहीं की है कि 'शून्य' कानूनी है या नहीं। आईओएस 9.0 में, उन्होंने टाइप को '((UIAlertAction) -> शून्य) में बदल दिया?', जिसका अर्थ है कि उन्होंने सत्यापित किया कि 'शून्य' की अनुमति है। –

3
extension UIAlertAction { 
    convenience init(title: String, style: UIAlertActionStyle) { 
     return self.init(title: title, style: style, handler: { (UIAlertAction) -> Void in }) 
    } 
} 

और केवल अंतिम तर्क छोड़ दें। आप इसे अपने "कारखाने" में डाल सकते हैं।

convenience init(title: String, style: UIAlertActionStyle, handler: ((UIAlertAction!) -> Void)!) 

आप देख सकते हैं, handler पैरामीटर प्रकार ((UIAlertAction!) -> Void)! के उलझाव से लपेटा न वैकल्पिक है:

5

Xcode प्रलेखन के अनुसार, UIAlertAction निम्नलिखित घोषणा के साथ एक convenience init विधि है। तो आप इसके लिए nil पास कर सकते हैं। उदाहरण के लिए, यदि आप एक UIAlertController उदाहरण है कि handler: nil के साथ एक UIAlertAction बना सकते हैं:

let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet) 
alertController.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)) 
presentViewController(alertController, animated: true, completion: nil) 

इसलिए, आप handler के लिए एक खाली ब्लॉक बनाने की जरूरत नहीं है।

func noop() {} 

func noop<T>(value: T) {} 

func noop<T>() -> T? { return nil } 

func noop<T, S>(value: T) -> S? { return nil } 

का उपयोग करें: (https://realm.io/news/closures-api-design संदर्भ:):

5

आप एक NOOP निर्धारित कर सकते हैं एक डिफ़ॉल्ट बंद है कि कुछ नहीं करता है के रूप में प्रयोग की जाने वाली

var okAction = UIAlertAction(title: "Ok", 
          style: UIAlertActionStyle.Default, 
          handler: noop) 
+0

उन मामलों के लिए सुविधाजनक जहां एक पैरामीटर जो बंद हो जाता है वह शून्य नहीं है। (प्रश्न में 'UIAlertAction' केस शून्य है, हालांकि।) उन एपीआई के लिए आपको कुछ अन्य रूपों की भी आवश्यकता हो सकती है जो 'कन्वेंशन (ब्लॉक)' बंद नहीं करते हैं। – rickster