1

NSDictionaryのキーとして@charを使用しようとしましたが、アプリケーションがクラッシュします。「無効な」キー名を検索しましたが、@"@"が見つかりませんでした。@ "@"以外のものを使用すると、すべて正常に機能します。

会社のリストがあり、各会社の最初の文字を取得してから、最初の文字をキーとして、NSMutableArrayを値として含むNSMutableDictionaryエントリを作成しています。

NSMutableDictionary indexDictionary = [[NSMutableDictionary alloc] init];

// here we have a loop on companyName
{
NSString *fristLetter = [[companyName substringToIndex:1] uppercaseString];
NSMutableArray *arrayOfIndexedCompanies = [indexDictionary valueForKey:firstLetter];

    if (arrayOfIndexedCompanies) {
       [arrayOfIndexedCompanies addObject:companyName]
    }
    else {
       NSMutableArray *newArray = [NSMutableArray array];
       [indexDictionary setObject:newArray forKey:firstLetter];
       [newArray addObject:companyName];
    }
}

スロー時にブレークポイントブレークを有効にすると、[indexDictionary valueForKey:firstLetter]で停止します...firstLetterが@"@"の場合のみ。私は次のように言っていました:

if ([firstLetter isEqualToString:@"@"]) {
    firstLetter = @"A";
}

これは正常に機能し、@開始会社をAセクションに正しく配置します。firstLetterを変更しない(@ "@"のままにする)と、アプリケーションがクラッシュします。

また、これは実際には私のコードではありません。修正しようとしているだけです。ObjCとFoundationに精通していないので、気を付けてください。

4

3 に答える 3

4

ドキュメントを読んでください:)

具体的には、このビット:

キーが「@」で始まらない場合は、objectForKey:を呼び出します。キーが「@」で始まる場合は、「@」を削除し、残りのキーで[super valueForKey:]を呼び出します。

私はそれsuper valueForKey:が呼ばれるのは幸せではないと思います:)

objectForKey:修正するには、代わりに電話するだけですvalueForKey:

于 2012-04-23T13:47:27.650 に答える
1

文字列@"@"を辞書キーとして使用すると、問題なく機能します。

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Test 1", @"@", @"Test 2", @"Another @", nil];
NSString *result = [dict objectForKey:@"@"];
NSLog(@"%@", result); 
// --> Test 1
于 2012-04-23T13:14:25.927 に答える
0

@"\u0040"で試してみてください

于 2012-04-23T13:27:04.890 に答える