2017-07-29 67 views
1

我想取兩個座標,並讓它們相互匹配,這樣一個按鈕彈出,但我不斷收到錯誤。這裏是我到目前爲止的代碼:如何使兩個座標相互匹配?

var userLocation: CLLocationCoordinate2D? 
var driverLocation: CLLocationCoordinate2D? 

func payTime() { 
     if driverLocation == userLocation { 
      payNowButton.isHidden = false 
     } 
    } 

我使用的斯威夫特3,火力地堡和Xcode的8

+3

組合的設計:有什麼錯誤? – NRitH

回答

2

要比較兩個CLLocationCoordinate2Ds您可以檢查它們的緯度和長期互相反對。

func payTime() { 
    if driverLocation?.latitude == userLocation?.latitude && driverLocation?.longitude == userLocation?.longitude { 
     // Overlapping 
    } 
} 

但是,只有它們是完全相同的位置才能使用。或者您可以使用這樣的事情:

func payTime() { 
    if let driverLocation = driverLocation, let userLocation = userLocation{ 
     let driverLoc = CLLocation(latitude: driverLocation.latitude, longitude: driverLocation.longitude) 
     let userLoc = CLLocation(latitude: userLocation.latitude, longitude: userLocation.longitude) 
     if driverLoc.distance(from: userLoc) < 10{ 
      // Overlapping 
     } 
    } 
} 

這兩個點轉換成CLLocation,然後檢查相隔多遠他們是在米。你可以在門檻周圍玩耍以獲得理想的結果。

編輯1:

這裏是一個擴展,使其更容易更容易比較的位置。

extension CLLocationCoordinate2D{ 
    func isWithin(meters: Double, of: CLLocationCoordinate2D) -> Bool{ 
     let currentLoc = CLLocation(latitude: self.latitude, longitude: self.longitude) 
     let comparingLoc = CLLocation(latitude: of.latitude, longitude: of.longitude) 
     return currentLoc.distance(from: comparingLoc) < meters 
    } 
} 

func payTime() { 
    if let driverLocation = driverLocation, let userLocation = userLocation{ 
     if driverLocation.isWithin(meters: 10, of: userLocation){ 
      // Overlapping 
     } 
    } 
} 
+1

像這樣一個質量差的問題不值得像你這樣的高質量的答案。 (投票)下一步將提出一個擴展'isWithin(米:的:)''上或CLLocationCoordinate2D''CLLocation' –

+0

@DuncanC那是一個偉大的想法!我將用擴展名編輯該問題。 –

+0

我也會添加擴展來使'CLLocationCoordinate2D'可以等化 – Alexander