无效函数中的意外非空返回值(Swift 2.0)

Zba*_*itZ 38 closures nsurlsession swift

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

在void函数中不断收到错误Unexpected non-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()
}

...
Run Code Online (Sandbox Code Playgroud)

也许我忽略了一些简单的事情,但我不确定为什么我的功能会被视为无效.任何想法都会非常感激!谢谢!

And*_*huk 55

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

return minions
Run Code Online (Sandbox Code Playgroud)

不会从您的功能返回.相反,它从完成处理程序返回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()
}
Run Code Online (Sandbox Code Playgroud)

然后在调用您的函数之前,您应该注册以NSNotification使用名称"minionsFetched" 进行侦听.只有在你收到通知后,才应该处理仆从,就好像它们被取出一样.


jay*_*ixz 22

我通过创建一个完成处理程序来修复我的 您可以这样做而不是使用通知:

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()
}
Run Code Online (Sandbox Code Playgroud)

  • 绝对是最简单的解决方法 (3认同)