2015-08-20 14 views
36

मैं स्टैक ओवरफ्लो प्रश्नों को स्किम कर रहा हूं, यह पता लगाने की कोशिश कर रहा हूं कि मैं अपने कोड के साथ गलत कहां जा रहा हूं, लेकिन मुझे लगता है कि ऐसा नहीं लगता! मैं अपनी स्विफ्ट 1.2 प्रोजेक्ट को स्विफ्ट 2.0 में बदलने की कोशिश कर रहा हूं, और मुझे अपनी कक्षा के साथ कोई समस्या है जो JSON डेटा डाउनलोड करता है।शून्य फंक्शन (स्विफ्ट 2.0) में अप्रत्याशित गैर-शून्य रिटर्न वैल्यू

मुझे लगातार त्रुटि प्राप्त हो रही है शून्य कार्य में अप्रत्याशित गैर-शून्य वापसी मूल्य।

यहां कोड है, कुछ हद तक छोटा, जिसे मैं उपयोग कर रहा हूं;

... 

class func fetchMinionData() -> [Minion] { 

    var myURL = "http://myurl/test.json" 

    let dataURL = NSURL(string: myURL) 

    let request = NSURLRequest(URL: dataURL!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5.0) 

    let session = NSURLSession.sharedSession() 

    session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in 
     let minionJSON = JSON(data!) 

     var minions = [Minion]() 

     for (_, minionDictionary) in minionJSON { 
      minions.append(Minion(minionDetails: minionDictionary)) 
     } 

     return minions 
     //THIS IS WHERE THE ERROR OCCURS 

    }).resume() 
} 

... 

शायद मैं कुछ सरल दिख रहा हूं, लेकिन मुझे यकीन नहीं है कि मेरा कार्य बिल्कुल शून्य क्यों माना जाएगा। किसी भी विचार की सराहना की जाएगी! धन्यवाद!

return minions 

अपने समारोह से वापस नहीं करता है:

उत्तर

52

आप क्योंकि आपके लाइन एक समस्या है। इसके बजाय, यह dataTaskWithRequest में पूरा होने वाले हैंडलर से आता है। और ऐसा नहीं करना चाहिए क्योंकि वह बंद एक शून्य कार्य है।

इस समस्या से आपके पास समस्या है जो dataTaskWithRequest एक असीमित ऑपरेशन है। जिसका अर्थ है कि यह आपके फ़ंक्शन को निष्पादित करने के बाद बाद में वापस आ सकता है।

तो, आपको अपना डिज़ाइन पैटर्न बदलना होगा।

static var minions:[Minion] = [] { 
    didSet { 
     NSNotificationCenter.defaultCenter().postNotificationName("minionsFetched", object: nil) 
    } 
} 



class func fetchMinionData() { 

    var myURL = "http://myurl/test.json" 
    let dataURL = NSURL(string: myURL) 
    let request = NSURLRequest(URL: dataURL!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5.0) 

    let session = NSURLSession.sharedSession() 

    session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in 
     let minionJSON = JSON(data!) 

     var minions = [Minion]() 

     for (_, minionDictionary) in minionJSON { 
      minions.append(Minion(minionDetails: minionDictionary)) 
     } 

     self.minions = minions 
     //THIS IS WHERE THE ERROR OCCURS 

    }).resume() 
} 

फिर अपने समारोह कॉल करने से पहले आप नाम "minionsFetched" के साथ NSNotification के लिए सुनने के लिए रजिस्टर चाहिए: कि ऐसा करने का

एक तरह से निम्नलिखित होगा। और केवल उस अधिसूचना प्राप्त करने के बाद आपको मिनियन को संसाधित करना चाहिए जैसे कि उन्हें लाया गया था।

+0

यह मुझे समझ में आता है। लेकिन अगर मैं 'वापसी के बाद 'लाइन को'} के बाद ले जाता हूं)। फिर से शुरू करें()', जहां मुझे लगता है कि इसे जाना चाहिए, मुझे त्रुटि प्राप्त होती है ** अनसुलझा पहचानकर्ता minions का उपयोग **। जो मुझे समझने के लिए प्रतीत नहीं होता है! – ZbadhabitZ

+0

@ZbadhabitZ मेरे अपडेट किए गए उत्तर की जांच करें –

+0

अब मुझे समझ में आता है! धन्यवाद, @ एंड्री! – ZbadhabitZ

19

मैंने पूरा होने वाला हैंडलर बनाकर मेरा निर्धारण किया। आप सूचनाओं का उपयोग करने के बजाय ऐसा कर सकते हैं:

class func fetchMinionData(completionHandler: (minions: [Minion]) -> Void) { 

    var myURL = "http://myurl/test.json" 

    let dataURL = NSURL(string: myURL) 

    let request = NSURLRequest(URL: dataURL!, cachePolicy: .ReloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 5.0) 

    let session = NSURLSession.sharedSession() 

    session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in 
     let minionJSON = JSON(data!) 

     var minions = [Minion]() 

     for (_, minionDictionary) in minionJSON { 
      minions.append(Minion(minionDetails: minionDictionary)) 
     } 

     completionHandler(minions: minions) 
     //THIS IS WHERE YOUR PREVIOUS ERROR OCCURRED 

    }).resume() 
} 
+2

निश्चित रूप से सबसे आसान कामकाज – joey

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