当前位置: 首页 > 面试题库 >

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

昌栋
2023-03-14
问题内容

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

...

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


问题答案:

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

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”
进行侦听。而且,只有在收到该通知后,您才应该像处理这些小仆一样处理它们。



 类似资料:
  • 其实,类似的问题这里问过,那里问过,但回答都不满意。代码示例是 输出为 关于 由于是虚函数,派生类不实现它,因此程序将调用; 则程序将调用; 是一个常规函数,程序将调用; 也是一个常规函数,程序将调用; 我不明白的部分来了,不是虚函数,是属于的指针,基本上只能访问中的函数!但输出是 相比之下,会像我想的那样调用。 在基类指针只能访问基类和虚函数中定义的函数的原则与实际输出之间似乎存在矛盾。原因也无

  • 给定下面的代码片段,函数调用有什么不同?什么是函数隐藏?什么是函数覆盖?它们与函数重载有什么关系?两者有什么区别?我在一个地方找不到关于这些的很好的描述,所以我在这里询问,这样我可以整合信息。

  • 问题内容: 我有一个返回类对象或nil的函数。该功能的目的是检查是否存在。聊天ID存储在MySQL中。如果ID存在,则执行Firebase引用以获取快照,然后获取对象。如果ID不存在,则返回nil: 但是,在我得到 void函数中非预期的非无效返回值。 关于我可能会想念的任何想法? 问题答案: 问题是您试图从一个封闭内部返回一个非空值,该值仅从封闭内部返回,但是由于该封闭期望一个空返回值,因此您会

  • 本文向大家介绍C++中虚函数与纯虚函数的用法,包括了C++中虚函数与纯虚函数的用法的使用技巧和注意事项,需要的朋友参考一下 本文较为深入的分析了C++中虚函数与纯虚函数的用法,对于学习和掌握面向对象程序设计来说是至关重要的。具体内容如下: 首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承、动态绑定。通过数据抽象,可以使类的接口与实现分离,使

  • 问题内容: 我刚刚开始学习面向对象,并且已经开始编写一个用户类,该类具有一种计算用户到对象的距离的方法。看起来像这样: 在上面标记的行上,出现以下错误: 我在其他地方寻找解决方案,但似乎找不到适用于此实例的任何东西。我在其他地方使用过distanceFromLocation代码,效果还不错,所以我不确定在这种情况下用法有什么不同。 谢谢你的帮助! 问题答案: 您在方法标头中缺少返回类型。 看来我的

  • 我想知道为什么我们不应该重写非虚拟函数?