2014-06-24 8 views
72

मैं स्विफ्ट में एक तर्क घोषित करने की कोशिश कर रहा हूं जो वैकल्पिक बंद हो जाता है। समारोह मैं घोषणा की है इस तरह दिखता है:स्विफ्ट में कोई वैकल्पिक बंद कैसे करता है?

class Promise { 

func then(onFulfilled:()->(), onReject:()->()?){  
    if let callableRjector = onReject { 
     // do stuff! 
    } 
} 

} 

लेकिन स्विफ्ट शिकायत है कि जहां "अगर दो" घोषित किया जाता है "एक सशर्त में सीमित मान एक वैकल्पिक प्रकार होना चाहिए"।

उत्तर

85

आपको कोष्ठक में वैकल्पिक बंद करना चाहिए। यह ? ऑपरेटर को सही ढंग से दायरा देगा। जब हम then फ़ंक्शन को कॉल

func then(onFulfilled:()->(), onReject: (()->())? = nil) { 
    onReject?() 
} 

इस तरह हम onReject पैरामीटर छोड़ सकते हैं:

func then(onFulfilled:()->(), onReject: (()->())?){  
    if let callableRjector = onReject { 
     // do stuff! 
    } 
} 
+0

क्या आप जानते हैं कि इसेष्ठक में संलग्न करने के लिए तर्क क्या है? – Marcosc

+4

शायद अस्पष्टता को दूर करने के लिए। यदि वैकल्पिक बंद करने के लिए वापसी मूल्य होना था, तो यह भ्रमित हो सकता है कि '() -> Int? 'का अर्थ क्या है। – Cezar

+3

इसके अलावा, स्विफ्ट पुस्तक से: "जब एक वैकल्पिक प्रकार घोषित करते हैं, तो सुनिश्चित करें कि कोष्ठक का सही ढंग से उपयोग करने के लिए उपयोग करना सुनिश्चित करें? ऑपरेटर। उदाहरण के तौर पर, पूर्णांक की वैकल्पिक सरणी घोषित करने के लिए, एनोटेशन टाइप करें (Int []) ?; लेखन int []? एक त्रुटि उत्पन्न करता है। " – Cezar

38

जब यह बुला कोड भी कम हम nil डिफ़ॉल्ट मान के रूप onReject पैरामीटर और वैकल्पिक ?() चेनिंग के लिए उपयोग कर सकते हैं बनाने के लिए ।

then({ /* on fulfilled */ }) 

हम भी then समारोह में onReject पैरामीटर पारित करने के लिए अनुगामी बंद सिंटैक्स का उपयोग कर सकते हैं:

then({ /* on fulfilled */ }) { 
    // ... on reject 
} 

यहाँ इसके बारे में एक blog post है।

29

के बाद से मुझे लगता है, कि यह "वैकल्पिक" बंद बस कुछ नहीं करना है, तो आप एक पैरामीटर डिफ़ॉल्ट मान के रूप एक खाली बंद के साथ इस्तेमाल कर सकते हैं:

func then(onFulfilled:()->(), onReject:()->() = {}){  
    // now you can call your closures 
    onFulfilled() 
    onReject() 
} 

इस समारोह अब के साथ या बिना onReject कहा जा सकता है कॉलबैक

then({ ... }) 
then({ ... }, onReject: { ... }) 

स्विफ्ट की भयानक Optionals? यहाँ कोई आवश्यकता नहीं है!

+0

अच्छा समाधान !! – Aznix

+0

मुझे यह समाधान पसंद है, बहुत आसान और पढ़ने में आसान है। – keithics

+0

यह अच्छा समाधान है! –

1

शायद यह एक क्लीनर तरीका है। विशेष रूप से जब बंद जटिल जटिल पैरामीटर है।

typealias SimpleCallBack =() ->() 

class Promise { 

func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){  
    if let callableRjector = onReject { 
     // do stuff! 
    } 
} 

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