Swift - "在无返回值函数中出现意外的非空返回值"

28

我已经开始编写一个用户类,其中包含一个计算用户与对象距离的方法。它看起来像这样:

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 代码,并且它运行得很好,所以我不确定在这种情况下有什么不同之处。


3
可能是因为你从一个不应该返回值的completionHandler中返回了值。参考这个回答 - mfaani
2个回答

45

你的方法头缺少返回类型。

func calculateDistance(location: CLLocation) -> CLLocationDistance {

看起来我的答案像是一个次优的副本,所以这里添加一些内容。

声明时没有返回类型的函数(包括在本例中的方法)被称为无返回类型的函数,因为:

func f() {
    //...
}

等同于:

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

通常来说,这种无返回值的函数无法返回任何值。 但是在Swift中,你可以仅返回一个值(我不确定它是否可以被称为“值”),即由()表示的“空值”。

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

现在,您可以理解错误消息的含义:

  

void函数中出现非void返回值

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


1
我的解决方案与相同的调试信息不同。我试图在类型为(Data?, URLResponse?, Error?) -> Void的闭包中返回一个值。这很令人困惑,因为我在函数签名为() -> Void的函数中使用了这个闭包。为了解决这个问题,我将数据保存到一个本地变量中,然后在闭包外部返回它。 - Andrew Kirna

2

你的函数calculateDistance没有指定返回值。这意味着它不返回任何内容。

然而,你有一行return distance,它确实返回一个值。

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

func calculateDistance(location: CLLocation) -> CLLocationDistance
{
  //your code
  return distance
}

2
您应该接受其中一个答案。此外,您可能应该阅读一下苹果公司的 Swift iBook,它可以非常清晰地介绍函数和返回值。 - Duncan C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接