小编典典

虚函数中的非预期非虚返回值(Swift 2.0)

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

...

也许我忽略了一些简单的事情,但是我不确定为什么我的函数将被认为完全无效。任何想法将不胜感激!谢谢!


阅读 270

收藏
2020-07-07

共1个答案

小编典典

您遇到了问题,因为您的线路:

return minions

不从您的函数返回。而是从中的完成处理程序返回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()
}

然后,在调用函数之前,您应该注册以NSNotification名称“ minionsFetched”
进行侦听。而且,只有在收到该通知后,您才应该像处理这些小仆一样处理它们。

2020-07-07