在回答关于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