在 Swift 中投射 CLLocationDistance

Casting CLLocationDistance in Swift

我是使用 Swift 的完全新手,我在尝试做一些本应非常简单的事情时感到头疼。

我有一个 Place 对象,它有一个名为 distance 的 Double 类型的变量。我正在使用以下代码来存储用户位置与其他一些位置之间的距离:

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 

最后一行显示了一个错误 "CLLocationDistance is not convertible to 'Double'"。据我所知,CLLocationDistance 应该是 Double。我尝试使用

将该值转换为 double 和 float
Double(dist)

obj.distance = dist as Double

但似乎没有任何效果。如果有任何帮助,我将不胜感激。

您需要 CLLocation 的两个对象,它们位于两个不同的位置

喜欢fromLocationtoLocation

然后你会得到距离

let distance = fromLocation.distanceFromLocation(toLocation)

新旧位置之间距离的代码示例:

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    if let firstLocation = locations.first as? CLLocation
    {
        mapView.setCenterCoordinate(firstLocation.coordinate, animated: true)

        let region = MKCoordinateRegionMakeWithDistance(firstLocation.coordinate, 1000, 1000)
        mapView.setRegion(region, animated: true)

        if let oldLocation = oldLocation {
            let delta: CLLocationDistance = firstLocation.distanceFromLocation(oldLocation)
            totalDistane += delta
            updateDistanceLabel()
        }

        oldLocation = firstLocation
    }
}

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

let distance = CLLocation.distanceFromLocation(loc)

这不是您认为的那样。 distanceFromLocation 是实例方法,但您将其作为 class 方法调用。与 ObjC 不同,Swift 允许这样做,但您实际返回的不是 CLLocationDistance,而是具有以下类型签名的函数:CLLocation -> CLLocationDistance。您可以通过自己添加类型注释来验证这一点:

let distance: CLLocation -> CLLocationDistance = CLLocation.distanceFromLocation(loc)

这称为部分应用,超出了我的回答范围,但要注意分配给 distance 的函数的第一个参数在作为实例调用时将是隐式的 self方法。

修复很简单:

let distance = loc.distanceFromLocation(loc)

那么一切都会如你所愿,至少从类型系统的角度来看是这样,因为这 returns 是 CLLocationDistance,它可以替代 Double