2
static NSArray *topologicallySortedReadableTypes;
static dispatch_once_t pred;

dispatch_once(&pred, ^{
    topologicallySortedReadableTypes = [self readableTypes];
    topologicallySortedReadableTypes = [topologicallySortedReadableTypes sortedArrayUsingComparator:^(id type1, id type2) {
        if (type1 == type2) return (NSComparisonResult)NSOrderedSame;
        if (UTTypeConformsTo((CFStringRef)type1, (CFStringRef)type2)) return (NSComparisonResult)NSOrderedAscending;
        if (UTTypeConformsTo((CFStringRef)type2, (CFStringRef)type1)) return (NSComparisonResult)NSOrderedDescending;
        // the problem is right here
        return ((NSUInteger)type1 < (NSUInteger)type2) ? (NSComparisonResult)NSOrderedAscending : (NSComparisonResult)NSOrderedDescending;
    }];
});

これはアップルが提供する最新バージョンのtexteditのソースコードで、10.7用です。Apple は 10.8 のソースを提供していないため、10.8 では問題なく動作するはずです。しかし、ブロックリテラルの戻り値の型が指定されていない場合、戻り値の型 'NSInteger' (別名 'long') は以前の戻り値の型 'NSComparisonResult' (別名 'enum NSComparisonResult') と一致する必要があるというエラーが発生します 。

4

1 に答える 1

3

コンパイラは、ブロックの戻り値の型についてより厳密/混乱していると思います。この関連する質問は、明示的な戻り値の型を比較ブロックに追加することを提案しています:

topologicallySortedReadableTypes = [topologicallySortedReadableTypes
    sortedArrayUsingComparator:^NSComparisonResult(id type1, id type2) {…}];
于 2012-12-17T09:02:20.037 に答える