我一直在浏览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()
}

...

也许我忽略了一些简单的事情,但我不确定为什么我的函数会被认为是无效的.任何 idea 都将不胜感激!非常感谢.

推荐答案

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

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"的函数.只有在收到通知后,你才应该像对待被抓走的仆从一样对待他们.

Swift相关问答推荐

WWDC Swift并发会话中的厨房服务示例令人困惑

启用完整并发判断以及如何解决警告

如何在HStack中均匀分布视图?

在用户将输入保存到SWIFT中的核心数据后,如何创建指向我的应用程序S主页的链接?

如何在DATE()中进行比较

如何在macOS中延迟退出应用程序的退出操作?

将变量设置为 @Published 会 destruct 代码而不会出现任何错误

为什么自定义串行队列的目标是全局队列时,Swift中不会并发执行?

本地对象的异步/等待引用捕获总是安全的还是理论上不安全?

有没有一种方法可以访问封闭实例ObservableObject以从属性包装器中的任何位置调用objectWillChange.send()

SwiftUI:按钮的圆形边缘的边框尺寸加倍

关于变量的视图的 SwiftUI 生命周期

自定义选取器的出现导致其他视图重新排列

P384 公钥获取IncorrectParameterSize

不使用 ViewController 时如何显示推送通知的alert 对话框

在 Select 器上显示alert Select SwiftUI

异步等待不会在项目中触发,但在 Xcode playground 中工作正常

Swift 2 或 3 中的 Google Analytics 问题

在 Xcode 中自动实现 Swift 协议方法

Swift 3.0 的 stringByReplacingOccurencesOfString()