приведение NSInteger в NSString - PullRequest
13 голосов
/ 23 февраля 2012

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

NSString *part1, *part2, *tempString;

NSInteger num1;
NSInteger num2;

part1=@"some";
part2=@"text";    

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

Ответы [ 7 ]

20 голосов
/ 23 февраля 2012

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

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

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

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

18 голосов
/ 15 января 2013

ответил 22 февраля '12 в 22:34, Бен Зотто:

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

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

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

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

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

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

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

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

1 голос
/ 23 февраля 2012

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

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

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

0 голосов
/ 06 ноября 2013
NSString *part1, *part2, *tempString;

NSInteger num1;
NSInteger num2;

part1=@"some";
part2=@"text";

tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
NSLog(@"%@",tempString);
0 голосов
/ 23 февраля 2012

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

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

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

0 голосов
/ 23 февраля 2012

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

 tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,(NSString *)num1, part2, (NSString *)num2];
0 голосов
/ 23 февраля 2012
NSString* tempString = [NSString stringWithFormat:@"%@%d%d", part1, num1, num2];
...