私はいくつかの異なる部分から1つの弦を作ろうとしています。これは私が今持っているものです。コードにエラーはありませんが、これを実行してそれをトリガーするイベントを実行するとすぐに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];
文字列と整数は基本的に異なるデータ型であり、Objective-Cでキャストしても変換は行われません。この場合、何が起こっているかについてコンパイラに嘘をつきます(したがってコンパイルされます)が、実行時に失敗しますアップ。
%d
の代わりに%@
を使用すると、整数をフォーマット文字列に直接埋め込むことができます。
tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
NSIntegerは、通常の「int」(数値)の単なる名前です。 NSStringは、文字列オブジェクトへのオブジェクト参照です。一部の数値型(intと浮動小数点)は、このようにCで直接相互に変換できますが、これら2つは相互運用性がまったくありません。あなたはもっと寛容な言語から来ているように聞こえますか? :)
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開発者登録が必要)
整数には%d
ではなく%@
を使用する必要があります。
したがって、[NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
は文字列をフォーマットするための正しいコードです。
それが役に立てば幸い。
NSString* tempString = [NSString stringWithFormat:@"%@%d%d", part1, num1, num2];
次のことを試してください。
tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,(NSString *)num1, part2, (NSString *)num2];
NSInteger
sは実際の整数であり、NSObject
から派生したオブジェクトではありません。試してください:
tempString = [NSString stringWithFormat:@"%@%d%@%d", part1, num1, part2, num2];
NSInteger
をNSString*
に強制しようとするキャストも危険であり、おそらくクラッシュの実際の原因です。コンパイラーは、その種のキャストステートメントで何をしているのかを知っていると信頼しているので、それを回避することができます。
NSString *part1, *part2, *tempString;
NSInteger num1;
NSInteger num2;
part1=@"some";
part2=@"text";
tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
NSLog(@"%@",tempString);