0

次のコード ブロックがあるとします。

[allKeys sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSDictionary *firstArticle = [articles objectForKey:(NSString *)obj1];
    NSNumber *firstSortID = [firstArticle objectForKey:@"sort_id"];

    NSDictionary *secondArticle = [articles objectForKey:(NSString *)obj2];
    NSNumber *secondSortID = [secondArticle objectForKey:@"sort_id"];

    if (firstSortID == nil || secondSortID == nil) {
        return nil;
    }
    else {
        return [secondSortID compare:firstSortID];
    }
}];

警告が表示されます:

結果型が「NSComparisonResult」(別名「enum NSComparisonResult」) の関数から「void *」を返す整数変換への互換性のないポインター

しかし、基本的に、そのうちの 1 つが nil の場合、比較が意味をなさないためにクラッシュします。nil の場合は気にせずに停止することをどのように伝えればよいでしょうか。

4

2 に答える 2

0

を使用してソートを途中で終了することはできませんsortUsingComparator:。したがって、nil値をソートする必要があります。nil最小値または最大値のどちらを返すかを決定しNSOrderedDescending、必要に応じて を返します。NSOrderedAscendingNSOrderedSame

ヒットしたかどうかを知る必要がある場合は、nil後でテストできるブロックにフラグを設定します。__blockブロック内で変更できるように、フラグを修飾子で宣言する必要があります。

__block BOOL nilFound = NO;
[allKeys sortUsingComparator:^NSComparisonResult(id obj1, id obj2)
{
   NSDictionary *firstArticle = [articles objectForKey:(NSString *)obj1];
   NSNumber *firstSortID = [firstArticle objectForKey:@"sort_id"];

   NSDictionary *secondArticle = [articles objectForKey:(NSString *)obj2];
   NSNumber *secondSortID = [secondArticle objectForKey:@"sort_id"];

   // set flag - could alternatively be set during comparison logic below
   if (firstSortID == nil || secondSortID == nil)
      nilFound = YES;

   // actual comparison, allowing for nil values
   ...
}];

// was a nil found?
if (nilFound) ...

補遺

他の人が安定した並べ替えの問題を提起しました。元のキーを使用してこれに対処できるはずです。たとえば、次のようになります。

if (firstSortID == nil)
{
   if (secondSortID == nil)
   {
      // both nil - use original keys as secondary sort, obj1 & obj2 are strings
      return [obj1 compare:obj2];
   }
   else
      return NSSortAscending;
}
else
   return secondSortID == nil ? NSSortDescending : [secondSortID compare:firstSortID];

NSSortAscending( &を切り替えNSSortDescendingて、nil値を反対側にグループ化することができます。)

于 2013-09-01T21:08:53.237 に答える