意外的非 Void Return Void 函数中的值 (Swift 2.0)
Unexpected Non-Void Return Value In Void Function (Swift 2.0)
我一直在浏览 Whosebug 问题,试图找出我的代码哪里出了问题,但我似乎做不到!我正在尝试将我的 Swift 1.2 项目转换为 Swift 2.0,我的 class 下载 JSON 数据时遇到问题。
我不断收到错误 无效函数 return 中的意外非无效值 。
这是我正在使用的代码,有些截断;
...
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
不 return 来自您的函数。相反,它 return 来自 dataTaskWithRequest
中的完成处理程序。它不应该这样做,因为那个闭包是一个 void 函数。
您遇到的问题是由于 dataTaskWithRequest
是一个异步操作。这意味着它可以在执行您的函数后 return。
所以,你需要改变你的设计模式。
一种方法如下:
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 一样对其进行处理。
我通过创建完成处理程序修复了我的问题。您可以这样做而不是使用通知:
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()
}
我一直在浏览 Whosebug 问题,试图找出我的代码哪里出了问题,但我似乎做不到!我正在尝试将我的 Swift 1.2 项目转换为 Swift 2.0,我的 class 下载 JSON 数据时遇到问题。
我不断收到错误 无效函数 return 中的意外非无效值 。
这是我正在使用的代码,有些截断;
...
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
不 return 来自您的函数。相反,它 return 来自 dataTaskWithRequest
中的完成处理程序。它不应该这样做,因为那个闭包是一个 void 函数。
您遇到的问题是由于 dataTaskWithRequest
是一个异步操作。这意味着它可以在执行您的函数后 return。
所以,你需要改变你的设计模式。
一种方法如下:
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 一样对其进行处理。
我通过创建完成处理程序修复了我的问题。您可以这样做而不是使用通知:
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()
}