Valore di restituzione non annullato inatteso nella funzione Void (Swift 2.0)

Ho sfogliato le domande StackOverflow cercando di capire dove sto andando male con il mio codice, ma proprio non riesco a sembrare! Sto cercando di convertire il mio progetto Swift 1.2 in Swift 2.0 e sto avendo un problema con la mia class che scarica i dati JSON.

Ricevo continuamente l’errore Valore restituito non vuoto non previsto nella funzione void .

Ecco il codice, un po ‘troncato, che sto usando;

... 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() } ... 

Forse sto trascurando qualcosa di semplice, ma non sono sicuro del perché la mia funzione verrebbe considerata nulla. Ogni pensiero sarebbe immensamente apprezzato! Grazie!

Hai un problema perché la tua linea:

 return minions 

non ritorna dalla tua funzione. Invece, ritorna dal gestore di completamento in dataTaskWithRequest . E non dovrebbe farlo perché quella chiusura è una funzione vuota.

Il problema che si ottiene dal fatto che dataTaskWithRequest è un’operazione asincrona. Ciò significa che può tornare più tardi dopo l’esecuzione della tua funzione.

Quindi, è necessario modificare il modello di progettazione.

Un modo per farlo sarebbe il seguente:

 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() } 

Quindi, prima di chiamare la funzione, è necessario registrarsi per ascoltare NSNotification con il nome “minionsFetched”. E solo dopo aver ricevuto quella notifica dovresti processare i minion come se fossero stati scaricati.

Ho risolto il mio creando un gestore di completamento. Puoi farlo invece di usare le notifiche:

 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() }