1

MKAnnotationと呼ばれるオブジェクトの配列がありますarrAnnotationsCLLocation「newLocation」というオブジェクトに格納されているものと同じ座標を持つ注釈の1つを選びたいです。

を使用しようとしていますNSPredicateが、機能しません。

NSPredicate *predicate = [NSPredicate  predicateWithFormat:@"(SELF.coordinate == %f)", newLocation.coordinate];
NSArray* filteredArray = [arrAnnotations filteredArrayUsingPredicate:predicate];
[self.mapView selectAnnotation:[filteredArray objectAtIndex:0] animated:YES];

FilteredArrayには常にゼロのオブジェクトが含まれています。

私も次のことを試しましたが、どちらも機能しません

NSPredicate *predicate = [NSPredicate  predicateWithFormat:@"(coordinate == %f)", newLocation.coordinate];

NSPredicate *predicate = [NSPredicate  predicateWithFormat:@"(coordinate > 0)"];

NSPredicate *predicate = [NSPredicate  predicateWithFormat:@"(coordinate.latitude == %f)", newLocation.coordinate.latitude];

最後の2つはアプリをクラッシュさせ、3つ目はNSInvalidArgumentExceptionfor[NSConcreteValue compare:]で、4つ目latitudeはキー値コーディングに準拠していないためです(これは座標が単なるac-structであり、NSObject?ではないためだと思います)。

どうすればこれを機能させることができNSPredicateますか?述語が内部でどのように機能するかを示すドキュメントへのリンクを誰かに教えてもらえますか?Appleの述語プログラミングガイドのほとんどを読んで理解したにもかかわらず、彼らが実際に何をしているのか理解していません。for ... in構文でループするよりも、述語を使用して巨大な配列を検索する方が効率的ですか?はい/いいえの場合、なぜですか?

4

1 に答える 1

6

MKAnnotationプロトコルのcoordinateプロパティはCLLocationCoordinate2Dであるため、 述語フォーマット文字列構文に従ったフォーマット構文structでは許可されていません。NSPredicate

NSPredicate predicateWithBlock:代わりに、自分がやろうとしていることを達成するために使用することもできますがCLLocationCoordinate2D、平等のためにそれを比較する方法と注意が必要です。

CLLocationCoordinate2DとプロパティはCLLocationDegreesデータ型であり、latitude定義上です。longitudedouble

クイック検索を使用すると、浮動小数点値が等しいかどうかを比較するときに直面する問題のいくつかの例を見つけることができます。いくつかの良い例がここここ、ここにあります

これらすべてを考慮すると、述語に次のコードを使用すると、問題が解決する可能性があると思います。

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

    id<MKAnnotation> annotation = evaluatedObject;

    if (fabsf([annotation coordinate].latitude - [newLocation coordinate].latitude) < 0.000001 
            && fabsf([annotation coordinate].longitude - [newLocation coordinate].longitude) < 0.000001) {
        return YES;
    } else {
        return NO;
    }

}];
于 2011-06-30T00:52:34.290 に答える