15

いくつかの異なるパーツから 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];
4

7 に答える 7

22

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

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

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

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

于 2012-02-22T22:34:08.867 に答える
18

12 年 2 月 22 日 22:34 に回答された、Ben Zotto:

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

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

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

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

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

だから、解決策:

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

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

于 2013-01-15T13:07:05.347 に答える
1

%dではなく for integerを使用する必要があり%@ます。

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

それが役に立てば幸い。

于 2012-02-22T22:35:04.633 に答える
0
NSString* tempString = [NSString stringWithFormat:@"%@%d%d", part1, num1, num2];
于 2012-02-22T22:34:12.637 に答える
0

以下を試してください:

 tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,(NSString *)num1, part2, (NSString *)num2];
于 2012-02-22T22:34:38.173 に答える
0

NSIntegers は実際の整数であり、NSObject派生オブジェクトではありません。試す:

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

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

于 2012-02-22T22:35:11.813 に答える
0
NSString *part1, *part2, *tempString;

NSInteger num1;
NSInteger num2;

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

tempString = [NSString stringWithFormat:@"%@%d%@%d", part1,num1, part2, num2];
NSLog(@"%@",tempString);
于 2013-11-06T10:12:30.653 に答える