2013-06-09 3 views
0

Отладочный журнал выглядит следующим образом.извлечение целого из nsstring

2013-06-09 17:09:09.192 BridgeDeal[2430:11303] suito: 2K 
2013-06-09 17:09:09.193 BridgeDeal[2430:11303] suit: 50 
2013-06-09 17:09:09.193 BridgeDeal[2430:11303] suito: 2Q 
2013-06-09 17:09:09.193 BridgeDeal[2430:11303] suit: 50 
2013-06-09 17:09:09.194 BridgeDeal[2430:11303] suito: 3J 
2013-06-09 17:09:09.194 BridgeDeal[2430:11303] suit: 51 

Значение suito выше является правильным, но не значение для suit выше. Вместо этого для значений suit я надеюсь получить 2,2,3.

for (int i = 0; i<3; i++) { 
    NSInteger suit = [[self.cardList objectAtIndex:i ] characterAtIndex:0] ; 
    NSLog(@"suito: %@", [self.cardList objectAtIndex:i ]); 
    NSLog(@"suit: %d", suit); 

} 

cardlist заявляется следующим образом.

@property (nonatomic, weak) NSMutableArray *cardList; 

Я попытался следующий код, но получаю сообщение об ошибке: bUnexpected type name 'NSRange'

NSInteger suit = [[self.cardList objectAtIndex:i ] substringWithRange:NSRange(0,1)] ; 

ответ

2

Что вы получаете это ASCII-код для номера. Это то, что характер.

Ваш второй раздел кода лучше, но использовать NSMakeRange или (NSRange){0,1}

+0

Использование NSRange) {0,1} Я получаю следующие проблемы и смешные результаты. 'Несовместимый указатель на целочисленное преобразование, инициализирующее 'NSInteger' (aka 'int') с выражением 'NSString *'' – zerowords

+0

Извините, забыли сказать, что строка, в которой вы вернули строку, а не целое число. Если вы хотите получить целое число, вы можете добавить вызов в integerValue в конце. – Wain

+0

Действительно, вы должны хранить данные по-другому, если хотите использовать номер в качестве индекса массива ... – Wain

1

Смените NSLog(@"suit: %d",suit); в NSLog(@"suit: %d",suit - '0');.

Когда вы вызываете characterAtIndex в объекте NSString, он возвращает переменную unichar (unsigned short); вы затем сохраняете это значение в NSInteger. Вы думаете, что это даст вам ошибку. Причина, по которой это не так, состоит в том, что переменные unichar (и в C, char) фактически являются целыми числами (в этом случае unichar просто typedef'd без знака). Каждый символ ('a', 'b', 'c', 'd' и т. Д.) Имеет другое число, связанное с ним. Так получилось, что число, связанное с символом «2» в наборе символов ASCII, равно 50, а число, связанное с «3», равно 51. Поскольку (в ASCII в любом случае) символы для цифр от 0 до 9, все последовательно, вы можете «взломать» свой способ получить фактическое число, представленное вычитанием значения «0» из значения для вашего символа (suit - '0'). Поскольку значение для «0» (в ASCII) равно 48, вычитание будет давать вам 2, 2 и 3 вместо 50, 50 и 51.

Если вы представляете карточные костюмы в качестве цифр, вы можете рассмотреть сохраняя их в массиве как цифры вместо строк.

+0

Я не пробовал ваш «взлом», но это имеет смысл. Я уверен, что было бы лучше сделать это, особенно потому, что мне не нужны результаты в NSLog, но я хочу использовать результат как индекс NSArray. Я должен попробовать ваш «взломать». – zerowords

+0

Да, ваш «хак» тоже работает. Огромное спасибо. – zerowords

+0

@zerowords «Взлом» не зависит от NSLog. Вы также можете изменить предыдущую строку кода. 'NSInteger suit = [[self.cardList objectAtIndex: i] characterAtIndex: 0] - '0';' Но, как уже упоминалось, вы можете просто сохранить костюм в виде целого числа. –

Смежные вопросы