2011-06-30 4 views
10

私はのisEqualに問題抱えているの平等をテストするにはどうすればよい:私は2つのCLLocations

コード:

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

currentanchorとcurrentbusiness.getCllocationがある場所

しかし、彼らはしている場合を同じ、関数bはなぜ呼び出されますか?私のコードに何か問題がありますか?

答えて

23

getClLocationという名前に基づいて、これらのオブジェクトの両方がタイプCLLocationであると仮定します。

CLLocationにはisEqual:メソッドの仕様がありません。したがって、単にオブジェクトのポインタを比較するNSObjectの実装を継承している可能性があります。同じデータを持つ2つの異なるオブジェクトがある場合、isEqual:の実装ではNOが返されます。そして、場所のわずかな違いだけで2つの異なるオブジェクトがある場合、それらは間違いなく等しいでしょう。

ロケーションオブジェクトを比較するときは、おそらくisEqual:は不要です。むしろ、CLLocationdistanceFromLocation:メソッドを使用することをお勧めします。このようなものが良いでしょう:

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

isEqualコンテンツのみではなくオブジェクトのみをチェックしてください。 ==演算子を使用して、オブジェクトの変数にアクセスして等価性をチェックする独自のメソッドを作成する必要があります。

+0

これは真実ではありませんが、のisEqualはちょうどそれを行うことになっている、コンテンツのにをチェック2つのオブジェクトが等しいかどうかを判定します。 2つのオブジェクトのプロパティが同じでない場合、2つのオブジェクトは等しくありません。 –

2

これはしばらくありました。

私がしたことはBJホーマーと似ています。私はちょうどこれを追加します。

@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 

私はこの質問を1 :)

+0

安全に実装するために 'other'を' id'として宣言することをお勧めします – Zerho

+2

座標の等価性を単純にテストし、それ以外の場合はsuperを返すほうが安い可能性が最も高いです。 'self.coordinate.latitude == other.coordinate.latitude && self.coordinate.longitude == other.coordinate.longitude' – FelixLam

+0

カテゴリ内のメソッドをオーバーライドしています。これは悪い習慣です。あなたはこのメソッドの不特定の動作を得るかもしれません。 appleの文書によると "カテゴリで宣言されたメソッドの名前が元のクラスのメソッドまたは同じクラス(またはスーパークラス)の別のカテゴリのメソッドと同じ場合、その動作はこのメソッドの実装は実行時に使用されます。これは、独自のクラスでカテゴリを使用している場合、カテゴリを使用して標準の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 
} 
関連する問題