2017-09-13 123 views
1

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

lat/long的精确匹配?纬度/长度和高度的精确匹配?经度,纬度,高度和时间戳的精确匹配?速度和课程怎么样?那么CLLocation那些只有经纬度/长度的对象呢?该位置的其他各种值不是可选项,因此使用init(latitude:longitude:)创建的位置的海拔高度是多少?

+0

通过继承'NSObject'?如果你试图用两个'CLLocation'对象调用'==',你会发现所使用的函数是'NSObject'声明的函数:'public func ==(lhs:NSObject,rhs:NSObject) - > Bool' 。比较两个CLLocation实例的“正确”方法可能是使用'distance(from:)'并将其与CLLocationDistance的阈值进行比较。 – JAL

+1

如果你想知道什么属性用于确定平等,你应该用不同的值运行一些测试,看看结果是什么。 – rmaddy

回答

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

+0

您从未将loc3与loc4进行比较! –

+0

把它作为一个旋转。但扰流警报是错误 – sfbarry14

+0

我在Objective-C中运行了一个快速测试,看起来'CLLocation'不会覆盖'isEqual:'。如果两个'CLLocation'实例是相同的实例,则它们只相等。 – rmaddy

1

CLLocation如何实现Equatable协议?

它没有。没有重写的==函数比较两个CLLocation实例。当两个CLLocation实例调用==,该NSObject==功能用于:

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

要真正比较两个CLLocation情况下,无论是比较每个你关心的属性(经纬度),或者使用内置的distance(from:)方法与两个位置并将其与CLLocationDistance阈值进行比较。

0

就充分验证什么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仅比较引用子类。