iphone - länge - meta title beispiel



Wie kann ich zwei CLLocationCoordinate2Ds vergleichen?(iPhone/iPad) (7)

Ich brauche eine Möglichkeit, zwei CLLocationCoordinate2D , aber wenn ich versuchte, == , würde es nicht funktionieren. Kann mir jemand mit dem besten Weg helfen, sie zu vergleichen?


Als kleine Ergänzung zu all diesen Antworten ist es sehr praktisch, den Vergleich als Preprozessor definieren zu lassen:

#define CLCOORDINATES_EQUAL( coord1, coord2 ) (coord1.latitude == coord2.latitude && coord1.longitude == coord2.longitude)

oder mit Epsilon:

#define CLCOORDINATE_EPSILON 0.005f
#define CLCOORDINATES_EQUAL2( coord1, coord2 ) (fabs(coord1.latitude - coord2.latitude) < CLCOORDINATE_EPSILON && fabs(coord1.longitude - coord2.longitude) < CLCOORDINATE_EPSILON)

So können Sie einen Vergleich wie folgt durchführen:

CLLocationCoordinate2D resultingCoordinate = ... a method call ...;
CLLocationCoordinate2D expectedCoordinate = CLLocationCoordinate2DMake(48.11, 11.12);

if(CLCOORDINATES_EQUAL( resultingCoordinate, expectedCoordinate)) {
    NSLog(@"equal");
} else {
    NSLog(@"not equal");
}

Eine andere Alternative ist die Verwendung einer Inline-Methode, wenn Sie den Präprozessor nicht mögen.


Eine schnelle Erweiterung:

import MapKit

extension CLLocationCoordinate2D: Equatable {}

public func ==(lhs: CLLocationCoordinate2D, rhs: CLLocationCoordinate2D) -> Bool {
    return (lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude)
}

[getestet ab Xcode 7.3.1, Swift 2.2] [und natürlich hat es immer noch die intrinsische Gefahr, Gleitkommawerte zu vergleichen, also sollten Sie die Verwendung von epsilon in Betracht ziehen, wie es in früheren Antworten erwähnt wurde]


In Swift 3 ist DBL_EPSILON veraltet. Verwenden Sie Double.ulpOfOne .

extension CLLocationCoordinate2D {
    func isEqual(_ coord: CLLocationCoordinate2D) -> Bool {
        return (fabs(self.latitude - coord.latitude) < .ulpOfOne) && (fabs(self.longitude - coord.longitude) < .ulpOfOne)
    }
}

Sie können CLLocationCoordinate in einen NSValue mit dieser Funktion + (NSValue *)valueWithMKCoordinate:(CLLocationCoordinate2D)coordinate

Und dann verwende isEqualToValue zum Vergleichen.

Zitat aus Apple doc der isEqualToValue Funktion:

Die NSValue-Klasse vergleicht den Typ und den Inhalt jedes Wertobjekts, um die Gleichheit zu bestimmen.

Ref: Apple doc von NSValue


Sie könnten eine Funktion definieren, die sich ziemlich an CoreLocation anlehnt:

BOOL CLLocationCoordinateEqual(CLLocationCoordinate2D coordinate1, CLLocationCoordinate2D coordinate2) { return (fabs(coordinate1.latitude - coordinate2.latitude) <= DBL_EPSILON && fabs(coordinate1.longitude - coordinate2.longitude) <= DBL_EPSILON); }


Wir können den Längen- und Breitengrad in NSString konvertieren und einen Stringvergleich durchführen.

+ (BOOL)isEqualWithCoordinate:(CLLocationCoordinate2D)location1 withAnotherCoordinate:(CLLocationCoordinate2D)location2{
NSString *locationString1 = [NSString stringWithFormat:@"%g, %g", location1.latitude, location1.longitude];
NSString *locationString2 = [NSString stringWithFormat:@"%g, %g", location2.latitude, location2.longitude];

if ([locationString1 isEqualToString:locationString2]) {
    return YES;
}else{
    return NO;
}

}

Seit% g konvertiert die abgeschnittene Dezimalzahl in 4 Ziffern.


CLLocationCoordinate2D c1, c2;
if (c1.latitude == c2.latitude && c1.longitude == c2.longitude)
{
    // ...
}

Ich scherze nicht. CLLocationCoordinate2D ist eine C-Struktur, und es gibt keine einfache Möglichkeit, C-Strukturen zu vergleichen, abgesehen vom Vergleich der einzelnen Elemente.





cllocation