web-dev-qa-db-ja.com

NSIntegerをNSStringにキャストする

私はいくつかの異なる部分から1つの弦を作ろうとしています。これは私が今持っているものです。コードにエラーはありませんが、これを実行してそれをトリガーするイベントを実行するとすぐにEXC_BAD_ACCESSが表示されます。このNSIntegerNSStringにキャストする別の方法はありますか?

NSString *part1, *part2, *tempString;

NSInteger num1;
NSInteger num2;

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

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

文字列と整数は基本的に異なるデータ型であり、Objective-Cでキャストしても変換は行われません。この場合、何が起こっているかについてコンパイラに嘘をつきます(したがってコンパイルされます)が、実行時に失敗しますアップ。

%dの代わりに%@を使用すると、整数をフォーマット文字列に直接埋め込むことができます。

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

NSIntegerは、通常の「int」(数値)の単なる名前です。 NSStringは、文字列オブジェクトへのオブジェクト参照です。一部の数値型(intと浮動小数点)は、このようにCで直接相互に変換できますが、これら2つは相互運用性がまったくありません。あなたはもっと寛容な言語から来ているように聞こえますか? :)

20
Ben Zotto

2012年2月22日22:34にBenZottoが回答しました。

文字列と整数は基本的に異なるデータ型であり、Objective-Cでキャストしても変換は行われません。この場合、何が起こっているかについてコンパイラに嘘をつきます(したがってコンパイルされます)が、実行時に失敗しますアップ。

%@の代わりに%dを使用すると、整数をフォーマット文字列に直接埋め込むことができます。

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

NSIntegerは、通常の「int」(数値)の単なる名前です。 NSStringは、文字列オブジェクトへのオブジェクト参照です。一部の数値型(intと浮動小数点)は、このようにCで直接相互に変換できますが、これら2つは相互運用性がまったくありません。あなたはもっと寛容な言語から来ているように聞こえますか? :)

「@ "%d"は32ビットでのみ機能することに注意してください。64ビットプラットフォーム用にコンパイルする場合に互換性のためにNSIntegerの使用を開始したら、フォーマット指定子として@ "%ld"を使用する必要があります。」 Marc Charbonneauによる

だから、解決策:

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

出典: Cocoaの文字列プログラミングガイド-文字列形式指定子 (iPhone開発者登録が必要)

18
saintech

整数には%dではなく%@を使用する必要があります。

したがって、[NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];は文字列をフォーマットするための正しいコードです。

それが役に立てば幸い。

1
Lorenzo B
NSString* tempString = [NSString stringWithFormat:@"%@%d%d", part1, num1, num2];
0
Dmitry S.

次のことを試してください。

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

NSIntegersは実際の整数であり、NSObjectから派生したオブジェクトではありません。試してください:

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

NSIntegerNSString*に強制しようとするキャストも危険であり、おそらくクラッシュの実際の原因です。コンパイラーは、その種のキャストステートメントで何をしているのかを知っていると信頼しているので、それを回避することができます。

0
fbrereto
NSString *part1, *part2, *tempString;

NSInteger num1;
NSInteger num2;

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

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