新 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?) -> Void
类型的闭包中返回一个值。这很令人困惑,因为我在签名 () -> Void
的函数中使用了这个闭包。为了解决这个问题,我将数据保存到一个局部变量中,然后在闭包之外返回它。【参考方案2】:
您的函数 calculateDistance 未指定返回值。这意味着它不会返回任何东西。
但是,您有一行 return distance
,它正在返回一个值。
如果你想让你的函数返回一个距离,你应该像这样声明它:
func calculateDistance(location: CLLocation) -> CLLocationDistance
//your code
return distance
【讨论】:
您应该接受其中一个答案。而且,您可能应该阅读 Apple Swift iBook。它非常清楚地涵盖了函数和返回值。以上是关于新 Swift 类的 void 函数中出现意外的非 void 返回值的主要内容,如果未能解决你的问题,请参考以下文章
类理解:void函数中出现意外的非void返回值(swift 3)