0
        self.sections = [[NSMutableDictionary alloc] init];
        BOOL found;
        for (NSDictionary *wine in sortedWines)
        {
            NSNumber *rate = [wine valueForKey:@"Rate"];
            NSString *rateStr = [NSString stringWithFormat:@"%.f", [rate floatValue]];
            found = NO;
            for (NSString *str in [self.sections allKeys])
            {
                if ([str isEqualToString:rateStr])
                {
                    found = YES;
                }
            }
            if (!found)
            {[self.sections setValue:[[NSMutableArray alloc] init] forKey:rateStr];}
        }
        for (NSDictionary *wine in sortedWines)
        {[[self.sections objectForKey:[NSString stringWithFormat:@"%.f", [[wine valueForKey:@"Rate"] floatValue]] ] addObject:wine];}

        // Sort:
        for (NSString *key in [self.sections allKeys])
        {[[self.sections objectForKey:key] sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"Rate" ascending:NO]]];}

このコードは私のワインをセクションに分けますが、降順でソートしません! NSNumber が NSString に変換されるためでしょうか? NSNumber 値を使用してコードを作成しようとしました:

        self.sections = [[NSMutableDictionary alloc] init];
        BOOL found;
        for (NSDictionary *wine in sortedWines)
        {
            NSNumber *rate = [wine valueForKey:@"Rate"];
            found = NO;
            for (NSNumber *str in [self.sections allKeys])
            {
                if ([str isEqualToNumber:rate])
                {
                    found = YES;
                }
            }
            if (!found)
            {[self.sections setValue:[[NSMutableArray alloc] init] forKey:rate];}
        }
        // Loop again to sort wines into their keys
        for (NSDictionary *wine in sortedWines)
        {[[self.sections objectForKey:[wine valueForKey:@"Rate"]] addObject:wine];}

        // Sort each section array
        for (NSString *key in [self.sections allKeys])
        {[[self.sections objectForKey:key] sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"Rate" ascending:NO]]];}

しかし、それは警告を出します

if (!found)
{[self.sections setValue:[[NSMutableArray alloc] init] forKey:rate];} 

「互換性のないポインター型が NSNumber ___strong を NSString 型のパラメーターに送信しています」

アプリを実行すると、エラーでクラッシュします-[__NSCFNumber localizedCaseInsensitiveCompare:]: unrecognized selector sent to instance 0x1e085810

機能させてセクションを降順に並べ替えるには、何を変更する必要がありますか? ありがとう。

4

2 に答える 2

2

sortDescriptorWithKey:ascending:のデフォルトセレクターがcaseInsensitiveCompare:になったかどうかはわかりませんが、以前は単にcompare:であったと確信しています。いずれの場合も、代わりにsortDescriptorWithKey:ascending:selector:を使用し、セレクターにcompare:を渡すことができます。これで2番目のエラーが修正されるはずです。最初のエラーが発生する理由はまだわかりません。

于 2012-11-15T01:37:01.630 に答える
1

読みやすいようにコードをフォーマットすると、はるかにうまくいくでしょう (そして、私たちはあなたをよりよく理解するでしょう)。例えば:

    // Loop again to sort wines into their keys
    for (NSDictionary *wine in sortedWines) {
        NSArray* section = [self.sections objectForKey:[wine valueForKey:@"Rate"]];
        [section addObject:wine];
    }

    // Sort each section array
    NSArray* sortDescriptorArray = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"Rate" ascending:NO]];
    for (NSString *key in [self.sections allKeys]) {
         NSArray* section = [self.sections objectForKey:key];
         [section sortUsingDescriptors:sortDescriptorArray];
    }

とりわけ、section配列を停止してダンプできるため、これによりデバッグがはるかに簡単になります。

または、別の方法が本当に気に入った場合は、代わりに APL または LISP を学ぶことを強くお勧めします。

于 2012-11-15T02:12:44.363 に答える