在 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
的两个对象,它们位于两个不同的位置
喜欢fromLocation
和toLocation
然后你会得到距离
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
。
我是使用 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 和 floatDouble(dist)
和
obj.distance = dist as Double
但似乎没有任何效果。如果有任何帮助,我将不胜感激。
您需要 CLLocation
的两个对象,它们位于两个不同的位置
喜欢fromLocation
和toLocation
然后你会得到距离
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
。