在回答關於SO的另一個問題時,我發現CLLocation
類符合Equatable
協議。它使用什麼方法來確定平等?CLLocation如何實現Equatable協議?
lat/long的精確匹配?緯度/長度和高度的精確匹配?經度,緯度,高度和時間戳的精確匹配?速度和課程怎麼樣?那麼CLLocation
那些只有經緯度/長度的對象呢?該位置的其他各種值不是可選項,因此使用init(latitude:longitude:)
創建的位置的海拔高度是多少?
在回答關於SO的另一個問題時,我發現CLLocation
類符合Equatable
協議。它使用什麼方法來確定平等?CLLocation如何實現Equatable協議?
lat/long的精確匹配?緯度/長度和高度的精確匹配?經度,緯度,高度和時間戳的精確匹配?速度和課程怎麼樣?那麼CLLocation
那些只有經緯度/長度的對象呢?該位置的其他各種值不是可選項,因此使用init(latitude:longitude:)
創建的位置的海拔高度是多少?
CLLocation類很像符合Equatable任何類,實現了(==)運算符
並回答你的其他問題,我決定使用此代碼啓動一個操場
import UIKit
import CoreLocation
var str = "Hello, playground"
var coordinate = CLLocationCoordinate2D.init(latitude: 42.0, longitude: 42.0)
var accuracy = CLLocationAccuracy.init(24.0)
var date = Date.init(timeIntervalSinceNow: 0)
var loc1 = CLLocation.init(coordinate: coordinate, altitude: 44.0, horizontalAccuracy: accuracy, verticalAccuracy: accuracy, timestamp: date)
var loc2 = CLLocation.init(coordinate: coordinate, altitude: 44.0, horizontalAccuracy: accuracy, verticalAccuracy: accuracy, timestamp: date)
var loc3 = CLLocation.init(latitude: 42.0, longitude: 42.0)
var loc4 = CLLocation.init(latitude: 42.0, longitude: 42.0)
var loc5 = CLLocation.init(coordinate: coordinate, altitude: 44.0, horizontalAccuracy: accuracy, verticalAccuracy: accuracy, course: .infinity, speed: 55.0, timestamp: date)
var loc6 = CLLocation.init(coordinate: coordinate, altitude: 44.0, horizontalAccuracy: accuracy, verticalAccuracy: accuracy, course: .infinity, speed: 55.0, timestamp: date)
var bool1 = loc1 == loc2 //false
var bool2 = loc2 == loc3 //false
var bool3 = loc2 == loc2 //true
var bool4 = loc1 == loc4 //false
var bool5 = loc5 == loc6 //false
和產生TRUE的唯一bool是bool3。
所以無論不同的CLLocation對象上的各個屬性是否相同,==運算符都不會將對象視爲相等。我猜測比較位置的最佳方法是比較你感興趣的CLLocation對象的字段
CLLocation
如何實現Equatable協議?
它沒有。沒有重寫的==
函數比較兩個CLLocation
實例。當兩個CLLocation
實例調用==
,該NSObject
==
功能用於:
public func ==(lhs: NSObject, rhs: NSObject) -> Bool
要真正比較兩個CLLocation
情況下,無論是比較每個你關心的屬性(經緯度),或者使用內置的distance(from:)
方法與兩個位置並將其與CLLocationDistance
閾值進行比較。
就充分驗證什麼JAL他回答說,我寫道:
import Foundation
import UIKit
import CoreLocation
class ViewController: UIViewController{
var cl1 = CLLocation()
var cl2 = CLLocation()
override func viewDidLoad() {
super.viewDidLoad()
if cl1 == cl2{
}
}
}
然後我命令點擊了==
(從if cl1 == cl2
)。它帶我到:
extension NSObject : CVarArg {
}
public func ==(lhs: Selector, rhs: Selector) -> Bool
public func ==(lhs: NSObject, rhs: NSObject) -> Bool
public struct NSZone {
}
要仔細檢查我的命令點擊CLLocation
看到:
open class CLLocation : NSObject, NSCopying, NSSecureCoding {
...
}
所以基本上==
是因爲它是從NSObject
僅比較引用子類。
通過繼承'NSObject'?如果你試圖用兩個'CLLocation'對象調用'==',你會發現所使用的函數是'NSObject'聲明的函數:'public func ==(lhs:NSObject,rhs:NSObject) - > Bool' 。比較兩個CLLocation實例的「正確」方法可能是使用'distance(from:)'並將其與CLLocationDistance的閾值進行比較。 – JAL
如果你想知道什麼屬性用於確定平等,你應該用不同的值運行一些測試,看看結果是什麼。 – rmaddy