2016-08-01 29 views
16

में स्विफ्ट में त्रुटि कैसे काम करती है, ऐसा लगता है कि हमारे पुराने कोड को बीटा 4 में परिवर्तित करते समय, मैं एनएसईआरआरआर में त्रुटि कास्टिंग रखता हूं। यह कभी-कभी चेतावनी के लिए भी नेतृत्व करेगा "त्रुटि 'से' एनएसईआरआरआर 'से सशर्त कलाकार हमेशा सफल होता है"। मुझे लगता है कि मैं समझ नहीं पा रहा हूं कि त्रुटि का सबसे अच्छा उपयोग कैसे करें। मैं error.code, error.localized डिस्क्रिप्शन जैसे सोचने के लिए प्राप्त करना चाहता हूं ... क्या कोई अच्छा दस्तावेज़ या ट्यूटोरियल है जो इन त्रुटि परिवर्तनों को समझाता है?एक्सकोड 8 बीटा 4

उदाहरण के लिए:

func webView(_ webView: UIWebView, didFailLoadWithError error: Error) { 

अभी मैं कुछ ऐसा कर रहा हूँ:

if let error = error as? NSError { 
if error.code == NSURLErrorCancelled { 

लेकिन उस चेतावनी

"हमेशा सफल होता है 'NSError' के लिए 'त्रुटि' से सशर्त डाली" देता है
+0

त्रुटि एक ही तरीका है कि स्ट्रिंग NSString करने के लिए Bridgeable है में NSError को Bridgeable है। आईई (एनएसईआरआरआर के रूप में त्रुटि) काम करेगा। – DerrickHo328

+0

क्या आप एक उत्तर को सही के रूप में चिह्नित करना चाहते हैं यदि यह आपकी मदद करता है? – DerrickHo328

+0

मुझे नहीं लगता कि ये उत्तर सही हैं, और मुझे लगता है कि यह बीटा 4 मुद्दा है। –

उत्तर

4

स्विफ्ट 3 में पकड़ने में त्रुटि बदल गई है। Release Notes में एनएसईआरआरआर के लिए खोजें। उद्धरण:

Additionally, error types imported from Cocoa and Cocoa Touch maintain all of the information in the corresponding NSError , so it is no longer necessary to catch let as NSError to extract (for example) the user-info dictionary. Specific error types also contain typed accessors for their common user-info keys. For example:

do { 
    let regex = try NSRegularExpression(pattern: "(", options: []) 
} catch { 
    // error is of type NSError already 
    print(error.localizedDescription) 
} 
+0

मैं इससे कैसे निपटूं? समारोह WebView (_ वेबदृश्य: UIWebView, didFailLoadWithError त्रुटि: त्रुटि) { अभी मैं की तरह कुछ कर रहा हूँ, तो चलो त्रुटि = के रूप में त्रुटि? NSError { अगर error.code == NSURLErrorCancelled { लेकिन यह चेतावनी देता है "त्रुटि 'से' एनएसईआरआरआर 'तक सशर्त कास्ट हमेशा" –

+1

सफल होता है मुझे यकीन नहीं है कि यह सही है या नहीं। 'error.code' अभी भी पहुंच योग्य नहीं है, और alt-click 'त्रुटि' आपको दिखाएगी कि यह अभी भी' त्रुटि' प्रकार का अनुमान है। –

+0

@ जेसन आप जिस मुद्दे पर हैं, वह 'त्रुटि के रूप में उपयोग कर रहा है? एनएसईआरओआर 'एनएसईआरआरआर के रूप में त्रुटि' के बजाय। त्रुटि हमेशा एनएसईआरआरआर में डाली जा सकती है, इसलिए आपको सशर्त कास्ट (यानी 'जैसा?') का उपयोग करने की आवश्यकता नहीं है क्योंकि यह हमेशा सफल रहेगा (जो वास्तव में त्रुटि आपको बता रहा है)। –

20

त्रुटि एक ही तरीका है कि स्ट्रिंग NSString करने के लिए Bridgeable है में NSError को Bridgeable है। आईई (एनएसईआरआरआर के रूप में त्रुटि) काम करेगा।

if (error as NSError).code == NSURLErrorCancelled { 
    // code 
} 
+5

एफवाईआई: बस अपना खुद का 'enum MyError डालने का प्रयास किया: त्रुटि {केस टेस्ट} '। परिणाम: 'nsError.code' प्रिंट' 0', 'nsError.domain' प्रिंट' MyError', 'nsError.localizedDescription' प्रिंट' कार्रवाई पूरी नहीं हो सकता है। (MyError त्रुटि 0.) ' –

16

यह करें:

स्विफ्ट 3.0 और स्विफ्ट 4,0

if error._code == NSURLErrorCancelled { } 
+5

यह काम करता है लेकिन ... wtf वह है? –

+1

स्विफ्ट 4 में भी काम करता है ... – AamirR

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