5

在回答关于 SO 的另一个问题时,我发现CLLocation该类符合Equatable协议。它使用什么方法来确定相等性?

纬度/经度的精确匹配?纬度/经度和高度的精确匹配?纬度、经度、高度和时间戳的精确匹配?速度和航向如何?CLLocation仅使用 lat/long 对创建的对象呢?该位置的各种其他值不是可选的,那么使用创建的位置的高度是init(latitude:longitude:)多少?

4

3 回答 3

2

如何CLLocation实现 Equatable 协议?

它没有。没有==比较两个CLLocation实例的覆盖函数。==使用两个CLLocation实例调用时,NSObject ==使用该函数:

public func ==(lhs: NSObject, rhs: NSObject) -> Bool

要实际比较两个CLLocation实例,请比较您关心的每个实例的属性(纬度或经度),或者使用distance(from:)具有两个位置的内置方法并将其与CLLocationDistance阈值进行比较。

于 2017-09-14T00:50:48.560 回答
2

只需完全验证 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仅比较引用的子类。

于 2017-09-17T18:15:37.553 回答
0

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 对象的字段

于 2017-09-13T23:24:25.420 回答