新 Swift 类的 void 函数中出现意外的非 void 返回值

Posted

技术标签:

【中文标题】新 Swift 类的 void 函数中出现意外的非 void 返回值【英文标题】:unexpected non-void return value in void function in new Swift class 【发布时间】:2016-07-19 22:40:16 【问题描述】:

我刚刚开始学习面向对象,并且我已经开始编写一个用户类,该类具有计算用户与对象的距离的方法。它看起来像这样:

class User
    var searchRadius = Int()
    var favorites : [String] = []
    var photo = String()
    var currentLocation = CLLocation()

    func calculateDistance(location: CLLocation)
        let distance = self.currentLocation.distanceFromLocation(location)*0.000621371
        return distance //Error returns on this line
    

在上面标记的行,我收到以下错误:

(!) Unexpected non-void return value in void function

我在别处寻找解决方案,但似乎找不到任何适用于此实例的内容。我在其他地方使用了 distanceFromLocation 代码,它工作正常,所以我不确定这种情况下的用法有什么不同。

感谢您的帮助!

【问题讨论】:

这也可能是因为您从一个不应该返回的 completionHandler 返回。见This answer 【参考方案1】:

您的方法标头中缺少返回类型。

func calculateDistance(location: CLLocation) -> CLLocationDistance 

似乎我的答案看起来是次等的重复,所以有些补充。

在没有返回类型的情况下声明的函数(包括方法,在这种情况下)被称为 void 函数,因为:

func f() 
    //...

相当于:

func f() -> Void 
    //...

通常,您不能从此类 void 函数返回任何值。 但是,在 Swift 中,你只能返回一个值(我不确定它是否可以称为“值”),由() 表示的“空值”。

func f() 
    //...
    return () //<- No error here.

现在,你可以理解错误信息的含义了:

void 函数中出现意外的非 void 返回值

您需要更改返回值,否则将返回类型Void 更改为其他类型。

【讨论】:

我的解决方案对于相同的调试消息是不同的。我试图在(Data?, URLResponse?, Error?) -&gt; Void 类型的闭包中返回一个值。这很令人困惑,因为我在签名 () -&gt; Void 的函数中使用了这个闭包。为了解决这个问题,我将数据保存到一个局部变量中,然后在闭包之外返回它。【参考方案2】:

您的函数 calculateDistance 未指定返回值。这意味着它不会返回任何东西。

但是,您有一行 return distance,它正在返回一个值。

如果你想让你的函数返回一个距离,你应该像这样声明它:

func calculateDistance(location: CLLocation) -> CLLocationDistance

  //your code
  return distance

【讨论】:

您应该接受其中一个答案。而且,您可能应该阅读 Apple Swift iBook。它非常清楚地涵盖了函数和返回值。

以上是关于新 Swift 类的 void 函数中出现意外的非 void 返回值的主要内容,如果未能解决你的问题,请参考以下文章

类理解:void函数中出现意外的非void返回值(swift 3)

void 函数中的意外非 void 返回值(swift)

如何停止返回导致“void函数中出现意外的非void返回值”?

void函数Swift3中的意外非void返回值

void函数Swift 4中的意外非void返回值

在嵌套函数中返回布尔值