Как CLLocation реализует Equatable протокол?
Отвечая на другой вопрос о SO, я обнаружил, что CLLocation
класс соответствует Equatable
протокол. Какой метод он использует для определения равенства?
Точное совпадение лат / лонг? Точное совпадение широты / долготы и высоты? Точное совпадение широты, долготы, высоты и отметки времени? Как насчет скорости и курса? Как насчет CLLocation
объекты, которые были созданы только с парой широта / долгота? Различные другие значения местоположения не являются дополнительными, поэтому, какая будет высота для местоположения, созданного с использованием init(latitude:longitude:)
?
3 ответа
Как
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
который сравнивает только ссылки.
Класс 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
и единственный bool, который выдает TRUE, это bool3.
поэтому независимо от того, являются ли отдельные свойства в разных объектах CLLocation одинаковыми, оператор == не будет видеть объекты как равные. Я предполагаю, что лучший способ сравнить местоположения - сравнить поля объектов CLLocation, которые вас интересуют.