意想不到的无效返回值在无效函数(Swift 2.0)

我一直在浏览StackOverflow的问题,试图找出我的代码出错的地方,但我似乎无法做到! 我正试图将我的Swift 1.2项目转换为Swift 2.0,并且我的类下载JSON数据时遇到问题。

我不断地收到错误在void函数中意外的非void返回值

这是我正在使用的代码,有些被截断了;

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

也许我忽略了一些简单的东西,但我不确定为什么我的function会被视为无效。 任何想法将非常感激! 谢谢!

你有一个问题,因为你的线:

 return minions 

不会从你的函数返回。 相反,它从dataTaskWithRequest的完成处理程序返回。 而且它不应该这样做,因为closures是一个无效的function。

dataTaskWithRequest是一个asynchronous操作的事实导致的问题。 这意味着它可以在执行你的函数后返回。

所以,你需要改变你的devise模式。

其中一种方法如下:

 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 。 只有在你得到通知后,你才应该像对待被抓取的那样处理这些仆从。

我通过创build完成处理程序来修复我的。 你可以这样做,而不是使用通知:

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