2015-06-26 7 views
46

मैं वर्तमान में स्विफ्ट 2.0 और एक्सकोड बीटा 2 का उपयोग करके अपना पहला आईओएस ऐप विकसित कर रहा हूं। यह बाहरी JSON पढ़ता है और डेटा के साथ तालिका दृश्य में एक सूची उत्पन्न करता है। हालांकि, मैं एक अजीब थोड़ा त्रुटि मिल रही है कि मैं ठीक करने के लिए प्रतीत नहीं कर सकते हैं:स्विफ्ट: कॉल में अतिरिक्त तर्क 'त्रुटि'

let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in 
      print("Task completed") 

      if(error != nil){ 
       print(error!.localizedDescription) 
      } 

      var err: NSError? 

      if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{ 

       if(err != nil){ 
        print("JSON Error \(err!.localizedDescription)") 
       } 

       if let results: NSArray = jsonResult["results"] as? NSArray{ 
        dispatch_async(dispatch_get_main_queue(), { 
         self.tableData = results 
         self.appsTableView!.reloadData() 
        }) 
       } 
      } 
     }) 

त्रुटि इस लाइन पर फेंक दिया जाता है:

Extra argument 'error' in call 

यहाँ मेरी कोड का एक टुकड़ा है

if let jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary{ 

क्या कोई मुझे बता सकता है कि मैं यहां क्या कर रहा हूं?

+0

यह लाइन यह त्रुटि नहीं दे रही है, मुझे लगता है कि आप बी को अलग-अलग लाइन में प्राप्त कर रहे हैं। –

+0

2.0 के साथ आपको 'डू' कैच 'ब्लॉक बनाने की आवश्यकता है। 'त्रुटि' अब 'NSJSONSerialization' के साथ पैरामीटर नहीं है। यहां इस प्रश्न के कई अन्य उत्तर हैं। ऐसा करने के लिए देखो, स्विफ्ट 2.0 –

उत्तर

75

के साथ स्विफ्ट 2, हस्ताक्षर NSJSONSerialization के लिए बदल गया है, नए त्रुटि हैंडलिंग प्रणाली के अनुरूप।

इसका इस्तेमाल इस तरह के एक उदाहरण है:

do { 
    if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary { 
     print(jsonResult) 
    } 
} catch let error as NSError { 
    print(error.localizedDescription) 
} 

के साथ स्विफ्ट 3, नाम NSJSONSerialization और उसके तरीकों में से बदल दिया है, the Swift API Design Guidelines के अनुसार।

यहाँ एक ही उदाहरण है:

do { 
    if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? [String:AnyObject] { 
     print(jsonResult) 
    } 
} catch let error as NSError { 
    print(error.localizedDescription) 
} 
+0

के साथ पकड़ें मैं स्विफ्ट 2.2 का उपयोग कर रहा हूं, और आपके पहले संस्करण की कोशिश की।यह सही ढंग से संकलित है लेकिन यह चुपचाप मर रहा है, 'प्रिंट' लाइनों में से कोई भी हिट नहीं करता है। जब मैं 'jsonResult' के सामने 'if' भाग को हटा देता हूं और चलाता हूं तो मैं अनुमान लगा सकता हूं कि jsonResult को' शून्य 'के रूप में सेट नहीं किया जा रहा है। मुझे यकीन है कि डेटा वैध जेसन स्ट्रिंग के रूप में शुरू होता है ... –

+1

@jeffery_the_wind आपका JSON शायद आपके विचार से अलग है। इसे आज़माएं: http://stackoverflow.com/a/33510776/2227743 – Moritz

+1

धन्यवाद, हाँ यह था! 'के रूप में बदल रहा है? एनएस डिक्शनरी 'के रूप में' के रूप में? आपके पहले उदाहरण में एनएसएआरएआरई 'मेरे लिए काम करता है। –

5

हालात स्विफ्ट 2 में बदल दिया है, तरीकों कि स्वीकार किए जाते हैं एक error पैरामीटर तरीकों कि एक inout पैरामीटर के माध्यम से यह लौटने के बजाय कि त्रुटि फेंक में तब्दील किया गया।

स्विफ्ट

हैंडलिंग त्रुटियों: Apple documentation को देख कर स्विफ्ट में, इस पद्धति एक nonoptional परिणाम देता है और कीवर्ड से संकेत मिलता है कि यह विफलता के मामलों में एक त्रुटि फेंकता फेंकता के साथ चिह्नित है।

आप इस विधि को एक अभिव्यक्ति अभिव्यक्ति में कॉल करते हैं और स्विफ्ट प्रोग्रामिंग भाषा (स्विफ्ट 2.1) में त्रुटि हैंडलिंग में वर्णित अनुसार और कोको और उद्देश्य के साथ स्विफ्ट का उपयोग करने में त्रुटि में वर्णित त्रुटि कथन के पकड़ खंड में किसी भी त्रुटि को संभालते हैं। सी (स्विफ्ट 2.1)।

कम से कम समाधान try? जो nil रिटर्न उपयोग करने के लिए यदि कोई त्रुटि होती है होगा:

do { 
    let message = try NSJSONSerialization.JSONObjectWithData(receivedData, options:.AllowFragments) 
    if let dict = message as? NSDictionary { 
     // ... process the data 
    } 
} catch let error as NSError { 
    print("An error occurred: \(error)") 
} 
:

let message = try? NSJSONSerialization.JSONObjectWithData(receivedData, options:.AllowFragments) 
if let dict = message as? NSDictionary { 
    // ... process the data 
} 

आप भी त्रुटि में रुचि रखते हैं, तो आप एक do/catch उपयोग कर सकते हैं

+0

यह स्विफ्ट 2.2 पर मेरे लिए काम किया – swiftBoy

0

इसे स्विफ्ट 3.0 में बदल दिया गया है।

do{ 
      if let responseObj = try JSONSerialization.jsonObject(with: results, options: .allowFragments) as? NSDictionary{ 

       if JSONSerialization.isValidJSONObject(responseObj){ 
        //Do your stuff here 
       } 
       else{ 
        //Handle error 
       } 
      } 
      else{ 
       //Do your stuff here 
      } 
     } 
     catch let error as NSError { 
       print("An error occurred: \(error)") } 
संबंधित मुद्दे