Мне нужно сопоставить значения char со значениями int в Objective-C. Я знаю, что NSDictionary отсутствует, потому что он имеет дело со ссылочными типами, а это значения. Карта будет использоваться при итерации через NSString. Каждый символ в строке будет преобразован в целое число. Все числа будут суммированы.

Использование NSDictionary кажется неподходящим из-за того, что мне приходилось делать принуждение типов. (Преобразование типов значений, char и int, в ссылочные типы.)

Я полагаю, что для этого мне придется перейти к C, но мой опыт работы с библиотеками C очень ограничен.

Есть ли что-то, что использует большинство разработчиков C, чтобы отображать значения char на значения int?

Изменить для уточнения

Эквивалент C # будет Dictionary<char,int>.

В псевдокоде хотелось бы следующее:

for (int i = 0; i < [string length]; i++) {
    char current = [string characterAtIndex:i];
    int score = map[current]; // <- I want map without boxing 
    // do something with score
}
1
ageektrapped 30 Авг 2011 в 21:32

3 ответа

Лучший ответ

Если я правильно понял, вы хотите сохранить char и int в словаре как ключи и значения. Однако NSDictionary принимает только объекты. Решение? Оберните char и int в объект NSNumber:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithInt:1],
                      [NSNumber numberWithChar:'a'],
                      [NSNumber numberWithInt:2],
                      [NSNumber numberWithChar:'b'], 
                      nil];

Или, если вам не нужен бокс, почему бы просто не создать функцию, которая принимает char s и возвращает int s?

int charToScore(char character)
{
    switch (character) {
        case 'a':
            return 1;
        case 'b':
            return 2;
        default:
            return 0;
    }
}
0
Pontus Granström 30 Авг 2011 в 18:40

Char в int?

char aChar = 'a';
int foo = (int) aChar;

Выполнено. Не нужен хеш или что-то еще. Даже если вы хотите отобразить char -> NSNumber, массив из 256 символов (char является 8-битным типом со знаком) очень мало накладных расходов.

(Если я полностью не понял ваш вопрос - вы просите (char *)? ... т.е. строки C? Покажите код.).

3
bbum 30 Авг 2011 в 17:41

@Pontus имеет правильный ответ в Objective-C, но если вы хотите использовать C ++, вы можете использовать std::map<char, int> (или все еще немного нестандартный unordered_map<char, int>.)

Чтобы использовать C ++ из Objective-C, вы должны переименовать файл из Whatever.m в Whatever.mm - это сообщает GCC, что файл содержит Objective-C ++, что позволяет использовать синтаксис Objective-C с Основы C ++.

0
Jonathan Grynspan 30 Авг 2011 в 18:00