2017-09-13 4 views
1

En répondant à une autre question sur SO, j'ai trouvé que la classe CLLocation est conforme au protocole Equatable. Quelle méthode utilise-t-elle pour déterminer l'égalité?Comment CLLocation implémente le protocole Equatable?

Correspondance exacte de lat/long? Correspondance exacte de lat/long et altitude? Correspondance exacte de la latitude, de la longitude, de l'altitude et de l'horodatage? Qu'en est-il de la vitesse et du parcours? Qu'en est-il des objets CLLocation qui ont été créés avec seulement une paire lat/long? Diverses autres valeurs de l'emplacement ne sont pas optionnelles, alors quelle serait l'altitude pour un emplacement créé en utilisant init(latitude:longitude:)?

+0

En héritant de 'NSObject'? Si vous essayez d'appeler '==' avec deux objets 'CLLocation', vous verrez que la fonction utilisée est celle déclarée pour' NSObject': 'public func == (lhs: NSObject, rhs: NSObject) -> Bool' . La façon "correcte" de comparer deux instances de 'CLLocation' serait probablement d'utiliser' distance (from:) 'et de le comparer à un seuil' CLLocationDistance'. – JAL

+1

Si vous voulez savoir quelles propriétés sont utilisées pour déterminer l'égalité, vous devez exécuter quelques tests avec différentes valeurs et voir les résultats. – rmaddy

Répondre

0

classe CLLocation un peu comme une classe qui est conforme aux assimilables, met en œuvre le (==) opérateur

Et pour répondre à vos questions, j'ai décidé de démarrer une aire de jeux avec ce code

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 

et le seul bool qui donne TRUE est bool3. Donc, même si les propriétés individuelles sur les différents objets CLLocation sont les mêmes, l'opérateur == ne verra pas les objets comme égaux. Im deviner la meilleure façon de comparer pour un à des emplacements est de comparer les champs au large des objets CLLocation qui sont d'intérêt pour vous

+0

Vous n'avez jamais comparé loc3 à loc4! –

+0

le prendre pour une rotation. mais l'alerte spoiler est fausse – sfbarry14

+0

J'ai effectué un test rapide en Objective-C et il semble que 'CLLocation' ne remplace pas' isEqual: '. Deux instances 'CLLocation' ne sont égales que s'il s'agit de la même instance. – rmaddy

1

Comment mettre en œuvre le protocole CLLocation assimilables?

Ce n'est pas le cas. Il n'y a pas de fonction == surchargée qui compare deux instances CLLocation. Lors de l'appel == avec deux CLLocation cas, la NSObject fonction == est utilisée:

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

Pour comparer en fait deux CLLocation cas, soit comparer les propriétés sur vous souciez chaque (latitude ou longitude), ou utiliser le construit en distance(from:) méthode avec deux emplacements et comparez cela à un seuil CLLocationDistance.

0

Il suffit de vérifier pleinement ce que JAL a dit dans sa réponse, je l'ai écrit:

import Foundation 
import UIKit 
import CoreLocation 

class ViewController: UIViewController{ 

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

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

     } 
    } 
} 

Je commande cliqué sur le == (de if cl1 == cl2). Il m'a fallu à:

extension NSObject : CVarArg { 
} 

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

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

public struct NSZone { 
} 

vérifier que je commande cliqué sur CLLocation et vu:

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

Donc, fondamentalement, la == est parce qu'il est sous-classé de NSObject qui compare uniquement les références.