Подтвердить что ты не робот

Литье NSInteger в NSString

Я пытаюсь сделать одну строку из нескольких разных частей. Это ниже, что я имею прямо сейчас. Я не получаю никаких ошибок в моем коде, но как только я запустил это и сделаю событие, которое запускает его, я получаю EXC_BAD_ACCESS. Есть ли другой способ сделать это NSInteger в NSString?

NSString *part1, *part2, *tempString;

NSInteger num1;
NSInteger num2;

[email protected]"some";
[email protected]"text";    

tempString = [NSString stringWithFormat:@"%@%@%@%@", 
              part1,
              (NSString *)num1, 
              part2, 
              (NSString *)num2];
4b9b3361

Ответ 1

Строка и целое число представляют собой принципиально разные типы данных, а кастинг в Objective-C не сделает для вас конверсии в этом случае, это просто ложь компилятору о том, что происходит (так оно компилируется), но при время работы взорвалось.

Вы можете встроить целое число непосредственно в строку формата, используя %d вместо %@:

    tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];

NSInteger - просто причудливое имя для обычного "int" (number). NSString является ссылкой на объект строкового объекта. Некоторые числовые типы (int и с плавающей запятой) могут быть как бы конвертированы между eachother непосредственно в C, но эти два не взаимодействуют вообще. Похоже, вы, возможно, исходите из более разрешительного языка?:)

Ответ 2

ответил 22/02/12 в 22:34, Бен Зотто:

Строка и целое число представляют собой принципиально разные типы данных и литье в Objective-C не сделает для вас конверсии в этом случае, это будет просто ложь компилятору о том, что происходит (поэтому он компилируется) но во время выполнения он взрывается.

Вы можете встроить целое число непосредственно в строку формата, используя% d вместо% @:

tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];

NSInteger - просто причудливое имя для обычного "int" (номер). NSString является ссылкой на объект строкового объекта. Некоторые числовые типы (int и с плавающей запятой) могут быть преобразованы между eachother непосредственно в C, как это, но эти два не взаимозаменяемо вообще. Похоже, вы могли бы исходить из более разрешительный язык?:)

"Имейте в виду, что @" % d "будет работать только на 32 бит. После того как вы начнете использовать NSInteger для совместимости, если вы когда-либо компилируете для 64-битной платформы, вы должны использовать @% ld в качестве спецификатора вашего формата." Марк Шарбонно

Итак, решение:

tempString = [NSString stringWithFormat:@"%@%ld%@%ld", part1, (long)num1, part2, (long)num2];

Источник: Руководство по программированию строк для Cocoa - Спецификаторы формата строки (требуется регистрация разработчиков iPhone)

Ответ 3

Вы должны использовать %d для целых чисел, а не %@.

Итак, [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2]; - это правильный код для форматирования вашей строки.

Надеюсь, что это поможет.

Ответ 4

NSString* tempString = [NSString stringWithFormat:@"%@%d%d", part1, num1, num2];

Ответ 5

попробуйте следующее:

 tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,(NSString *)num1, part2, (NSString *)num2];

Ответ 6

NSInteger являются действительными целыми числами - не NSObject - пронумерованными объектами. Попробуйте:

tempString = [NSString stringWithFormat:@"%@%d%@%d", part1, num1, part2, num2];

Листинг, пытающийся заставить NSInteger в NSString* также опасен и, вероятно, является фактическим источником вашего сбоя. Компилятор позволяет вам уйти от него, потому что вам доверяют, что вы знаете, что вы делаете с этим выражением о литье.

Ответ 7

NSString *part1, *part2, *tempString;

NSInteger num1;
NSInteger num2;

[email protected]"some";
[email protected]"text";

tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
NSLog(@"%@",tempString);