我一直在浏览 StackOverflow 问题,试图找出我的代码哪里出了问题,但我似乎做不到!我正在尝试将我的 Swift 1.2 项目转换为 Swift 2.0,但我的类在下载 JSON 数据时遇到问题。
我不断收到错误消息unexpected non-void return value in void function。
这是我正在使用的代码,有些截断;
...
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
不会从您的函数返回。相反,它从 dataTaskWithRequest
中的完成处理程序返回。它不应该这样做,因为该闭包是一个 void 函数。
您遇到的问题是因为 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
。只有在您收到该通知后,您才应该像处理这些 minions 一样处理它们。
关于swift - Void 函数中的意外非 Void 返回值(Swift 2.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32121108/