我在與isEqual:方法,問題的平等:如何測試兩個CLLocations
代碼:
if (currentAnchor isEqual:currentBusiness.getCllLocation))
{
do a;
}
else
{
do b;
}
currentanchor和currentbusiness.getCllocation的位置
但是,如果他們是同樣,爲什麼函數b被調用?我的代碼有問題嗎?
我在與isEqual:方法,問題的平等:如何測試兩個CLLocations
代碼:
if (currentAnchor isEqual:currentBusiness.getCllLocation))
{
do a;
}
else
{
do b;
}
currentanchor和currentbusiness.getCllocation的位置
但是,如果他們是同樣,爲什麼函數b被調用?我的代碼有問題嗎?
我假設這兩個對象的類型都是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;
}
isEqual
只檢查對象不是他們的內容。您需要在訪問對象的變量時創建自己的方法,並使用==
運算符檢查它們是否相等。
已經有一段時間了。
我所做的與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
我很驚訝,我是一個問這個問題:)
我建議將'other'聲明爲'id'來安全地實現它 – Zerho
簡單地在座標上測試相等性並以其他方式返回超級最有可能更便宜。 'self.coordinate.latitude == other.coordinate.latitude && self.coordinate.longitude == other.coordinate.longitude' – FelixLam
您正在重寫某個類別中的方法。這是一種不好的做法。你可能會得到這種方法的一個不確定的行爲。根據蘋果文檔 「如果在類別中聲明的方法的名稱與原始類中的方法相同,或者在同一類(或甚至超類)上的另一類中的方法相同,則行爲未定義在運行時使用哪種方法實現,如果您使用自己的類使用類別,則不太可能成爲問題,但在使用類別向標準Cocoa或Cocoa Touch類中添加方法時可能會導致問題。 –
雨燕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
}
這是不正確的,的isEqual應該只是做到這一點,檢查內容對確定兩個對象是否相等。如果兩個對象的屬性不相同,則兩個對象不相等。 –