2015-01-03 48 views
2

我是一個使用Swift的完全新手,我很頭痛,想要做一些應該很簡單的事情。在Swift中施放CLLocationDistance

我有一個對象放置一個類型爲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是無法轉換爲‘雙’」。據我所知,CLLocationDistance應該是一個Double。我試着投該值將翻一番,使用浮動

Double(dist) 

obj.distance = dist as Double 

,但似乎沒有任何工作。我將不勝感激任何幫助。

+0

您的代碼沒有意義'distanceFromLocation'不是CLLocation上的類方法 - 它是一個實例方法,因此您需要在現有的CLLocation對象上調用它。 – Paulw11

+0

「Place」的定義是什麼? 「距離」是如何申報的? –

+0

'CLLocationDistance'被定義爲'typealias CLLocationDistance = Double',所以它們完全相同,這意味着你有其他問題。 –

回答

7

這是發生的原因歸結爲以下行:

let distance = CLLocation.distanceFromLocation(loc) 

這不是做你覺得它在做什麼。 distanceFromLocation是一種實例方法,但您將其稱爲類方法。與ObjC不同的是,Swift允許這樣做,但你實際得到的不是CLLocationDistance,而是一個具有以下類型簽名的函數:CLLocation -> CLLocationDistance。您可以通過在類型標註自己添加驗證這一點:

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

這就是所謂的部分應用程序,是我的回答的範圍之外,但要注意的是分配給distance函數的第一個參數是隱式當作爲一個實例方法調用時,調用self

修復的方法是簡單的:

let distance = loc.distanceFromLocation(loc) 

那麼你的願望,至少從類型系統的角度來看,因爲這正確返回CLLocationDistance,這是替代的Double一切都將正常工作。

+1

偉大的答案,格雷戈裏。非常感謝你。 – rmvz3

2

您需要使用兩個不同的位置

等爲fromLocationtoLocation

CLLocation兩個對象。然後你會得到

距離
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 
    } 
} 
+0

謝謝你,Ashish。這不是我的問題的答案,但絕對是一個不錯的選擇。 – rmvz3