Как 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, которые вас интересуют.

Другие вопросы по тегам