swift - Void 函数中的意外非 Void 返回值(Swift 2.0)

标签 swift closures nsurlsession

我一直在浏览 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/

相关文章:

optimization - 与优化基于堆栈的系统上的闭包相关的问题的名称是什么?

ios - iOS 上的 AWS API 网关

ios - 发送http post请求时NSURLErrorDomain Code=-1001错误

python - "NameError: free variable ' var'在封闭范围内赋值之前引用“如何在实际代码中出现?

arrays - 检查数组是否包含 Swift 4 中的元素

swift - Swift 2.0 会与 OS X 10.9 或更低版本兼容吗?

swift - 在 iOS 13 中隐藏状态栏

python - 嵌套函数如何在 Python 中工作?

ios - 在文档目录中下载或移动文件异步 - iOS

swift - 设备时间为 24 小时格式时应用程序崩溃