2017-09-13 4 views
1

Bei der Beantwortung einer weiteren Frage zu SO habe ich festgestellt, dass die Klasse CLLocation dem Protokoll Equatable entspricht. Mit welcher Methode wird die Gleichheit ermittelt?Wie implementiert CLLocation das Equatable-Protokoll?

Exakte Übereinstimmung von lat/long? Exakte Übereinstimmung von Lat/Long und Höhe? Exakte Übereinstimmung von Breite, Länge, Höhe und Zeitstempel? Was ist mit Geschwindigkeit und Kurs? Was ist mit CLLocation Objekten, die nur mit einem Lat/Long-Paar erstellt wurden? Verschiedene andere Werte des Standortes sind keine Optionale. Wie hoch wäre die Höhe für einen Standort, der mit erstellt wurde?

+0

Durch Erben von 'NSObject'? Wenn Sie versuchen, mit zwei 'CLLocation'-Objekten' == 'aufzurufen, sehen Sie, dass die verwendete Funktion die für' NSObject' deklarierte ist: 'public func == (lhs: NSObject, rhs: NSObject) -> Bool' . Der "richtige" Weg, zwei "CLLocation" -Instanzen zu vergleichen, wäre wahrscheinlich, "distance (from:)" zu verwenden und dies mit einem "CLLocationDistance" -Schwellenwert zu vergleichen. – JAL

+1

Wenn Sie wissen möchten, welche Eigenschaften zur Bestimmung der Gleichheit verwendet werden, sollten Sie einige Tests mit verschiedenen Werten durchführen und sehen, was die Ergebnisse sind. – rmaddy

Antwort

0

CLLocation Klasse viel wie jede Klasse, die gleichzusetzen entspricht, implementiert den Operator (==)

Und Ihre andere Fragen zu beantworten, habe ich beschlossen,

einen Spielplatz mit diesem Code zu starten
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 

und der einzige bool, der WAHR ergibt, ist bool3.

also unabhängig davon, ob die einzelnen Eigenschaften auf verschiedenen CLLocation-Objekten gleich sind, wird der Operator == die Objekte nicht als gleich sehen. Im Erraten der beste Weg, um für ein Standorte vergleichen Sie die Felder aus den CLLocation Objekte zu vergleichen, die

+0

Sie haben loc3 nie mit loc4 verglichen! –

+0

nehmen Sie es für eine Drehung. aber spoiler alert es ist falsch – sfbarry14

+0

Ich habe einen schnellen Test in Objective-C ausgeführt und es scheint, dass 'CLLocation' überschreibt' isEqual: 'nicht. Zwei CLLocation-Instanzen sind nur dann gleich, wenn sie dieselbe Instanz sind. – rmaddy

1

für Sie von Interesse sind Wie CLLocation das gleichzusetzen Protokoll implementieren?

Es tut es nicht. Es gibt keine überschriebene == Funktion, die zwei CLLocation Instanzen vergleicht. Wenn == mit zwei CLLocation Instanzen aufrufen, wird die NSObject== Funktion:

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

tatsächlich zwei CLLocation Instanzen zu vergleichen, entweder vergleichen Sie die Eigenschaften auf jedem Sie kümmern sich um (Breite oder Länge) oder den integrierten Einsatz in distance(from:) Methode mit zwei Standorten und vergleichen Sie das mit einer CLLocationDistance Schwelle.

0

Nur vollständig zu überprüfen, was JAL in seiner Antwort hat gesagt, ich schrieb:

import Foundation 
import UIKit 
import CoreLocation 

class ViewController: UIViewController{ 

    var cl1 = CLLocation() 
    var cl2 = CLLocation() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     if cl1 == cl2{ 

     } 
    } 
} 

Dann Befehl, den ich auf dem == geklickt (von if cl1 == cl2). Es hat mich an:

extension NSObject : CVarArg { 
} 

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

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

public struct NSZone { 
} 

überprüfen zu verdoppeln Ich befehle auf CLLocation geklickt und sah:

open class CLLocation : NSObject, NSCopying, NSSecureCoding { 
... 
} 

Also im Grunde die == ist, weil es von NSObject subclassed ist, die nur Referenzen vergleicht.