2011-06-30 53 views
10

我在與isEqual:方法,問題的平等:如何測試兩個CLLocations

代碼:

if (currentAnchor isEqual:currentBusiness.getCllLocation)) 
    { 
     do a; 
    } 
    else 
    { 
     do b; 
    } 

currentanchor和currentbusiness.getCllocation的位置

但是,如果他們是同樣,爲什麼函數b被調用?我的代碼有問題嗎?

回答

23

我假設這兩個對象的類型都是CLLocation,基於名稱getClLocation

CLLocation不對其isEqual:方法所做的任何規範,所以它可能只是繼承的NSObject執行,它只是比較對象的指針。如果您有兩個具有相同數據的不同對象,則isEqual:實現將返回NO。如果你有兩個截然不同的對象,只是位置有輕微的變化,他們絕對不會是平等的。

比較位置對象時,您可能不想要isEqual:。相反,您可能想使用CLLocation上的distanceFromLocation:方法。這樣的事情會更好:

CLLocationDistance distanceThreshold = 2.0; // in meters 
if ([currentAnchor distanceFromLocation:currentBusiness.getCllLocation] < distanceThreshold) 
{ 
    do a; 
} 
else 
{ 
    do b; 
} 
0

isEqual只檢查對象不是他們的內容。您需要在訪問對象的變量時創建自己的方法,並使用==運算符檢查它們是否相等。

+0

這是不正確的,的isEqual應該只是做到這一點,檢查內容對確定兩個對象是否相等。如果兩個對象的屬性不相同,則兩個對象不相等。 –

2

已經有一段時間了。

我所做的與BJ Homer類似。我只是補充一點。

@interface CLLocation (equal) 
- (BOOL)isEqual:(CLLocation *)other; 
@end 

@implementation CLLocation (equal) 

- (BOOL)isEqual:(CLLocation *)other { 


    if ([self distanceFromLocation:other] ==0) 
    { 
     return true; 
    } 
    return false; 
} 
@end 

我很驚訝,我是一個問這個問題:)

+0

我建議將'other'聲明爲'id'來安全地實現它 – Zerho

+2

簡單地在座標上測試相等性並以其他方式返回超級最有可能更便宜。 'self.coordinate.latitude == other.coordinate.latitude && self.coordinate.longitude == other.coordinate.longitude' – FelixLam

+0

您正在重寫某個類別中的方法。這是一種不好的做法。你可能會得到這種方法的一個不確定的行爲。根據蘋果文檔 「如果在類別中聲明的方法的名稱與原始類中的方法相同,或者在同一類(或甚至超類)上的另一類中的方法相同,則行爲未定義在運行時使用哪種方法實現,如果您使用自己的類使用類別,則不太可能成爲問題,但在使用類別向標準Cocoa或Cocoa Touch類中添加方法時可能會導致問題。 –

0

雨燕4.0的版本:

let distanceThreshold = 2.0 // meters 
if location.distance(from: CLLocation.init(latitude: annotation.coordinate.latitude, 
              longitude: annotation.coordinate.longitude)) < distanceThreshold 
{ 
    // do a 
} else { 
    // do b 
} 
相關問題