在Swift中强制转换CLLocationDistance

rmv*_*vz3 3 casting ios swift

我是一个使用Swift的新手,我正在努力做一些应该非常简单的事情.

我有一个对象Place,其变量类型为Double,称为distance.我使用以下代码存储用户位置和其他一些位置之间的距离:

var obj = res as Place
let loc = CLLocation(latitude: obj.location.lat, longitude: obj.location.lng)
let dist = CLLocation.distanceFromLocation(loc)
obj.distance = dist // ERROR 
Run Code Online (Sandbox Code Playgroud)

最后一行显示错误说"CLLocationDistance不能转换为'Double'".据我所知,CLLocationDistance应该是Double.我试图将该值转换为double并浮动使用

Double(dist)
Run Code Online (Sandbox Code Playgroud)

obj.distance = dist as Double
Run Code Online (Sandbox Code Playgroud)

但似乎没什么用.我将不胜感激任何帮助.

Gre*_*ley 8

发生这种情况的原因归结为以下几行:

let distance = CLLocation.distanceFromLocation(loc)
Run Code Online (Sandbox Code Playgroud)

这不是你认为它正在做的事情.distanceFromLocation是一个实例方法,但您将其称为类方法.与ObjC不同,Swift允许这样做,但你实际上得到的不是一个CLLocationDistance具有以下类型签名的函数:CLLocation -> CLLocationDistance.您可以通过自己添加类型注释来验证这一点:

let distance: CLLocation -> CLLocationDistance = CLLocation.distanceFromLocation(loc)
Run Code Online (Sandbox Code Playgroud)

这被称为部分应用程序,并且超出了我的答案的范围,除了要注意分配给的函数的第一个参数在被调用为实例方法时distance将是隐式的self.

修复很简单:

let distance = loc.distanceFromLocation(loc)
Run Code Online (Sandbox Code Playgroud)

然后一切都会按照您的意愿工作,至少从类型系统的角度来看,因为这正确地返回了一个CLLocationDistance可替代的东西Double.