1

NSString と NSNumber 整数など、さまざまなオブジェクトの NSArray があります。

使用するだけでなく、オブジェクトの内容を印刷するために使用したい特定のフォーマット文字列があります

@"%@|%@" 

しかし、例えば

@"%-13s|%010d"

ここ StackOverflow などで見つけた @"%@|%@" タイプの印刷を行うために、以下を実装しました。

@implementation NSString (NSArrayFormatExtension)

+ (id) stringWithFormatFromNSArray: (NSString *) format array: (NSArray*) args;
{
  id *argList = malloc( sizeof( id )  * [args count] );
  [ args getObjects: argList ];

  NSString* result = [ [ [ NSString alloc ] initWithFormat: format arguments: (va_list) argList ] autorelease ];

  free(argList);

  return result; 
}

@end

呼び出されて、次のように出力されます。

NSString *printstring = [ NSString stringWithFormatFromNSArray: nsFormatString array: nsarray_of_objects ]

@"%@ %@" 型の nsFormatStrings はオブジェクトの内容を出力できますが、@"%s %d" 型の形式で基礎となる C 型をより詳細な形式で出力することはできません。

私には 2 つの問題があり、解決策についていくつかの考えがありますが、ここで車輪を再発明したくありませんでした。

1.) className から派生した型のスイッチを使用して NSArray 項目を反復処理することはできましたが、これを行う標準的な方法があるかどうか疑問に思いました。

また、フォーマット文字列を個々の % エンティティに分解することも意味します (または、配列として渡し処理する - あまりクリーンではなく、上記のパイプ区切り文字など、他の非フォーマット エントリを保持する必要があります)。

2.) @"%@|%@" を使用する上記のコードは、gcc / objc / objc++ 4.6.X 以降を使用する 32 ビット Linux ではそのまま動作しますが、64 ビット Linux ではセグメンテーション違反が発生するため、動作させる必要があります。両方。

私が読んだ限りでは、これは一部の Linux システムでの va_list の 64 ビット実装に関するかなり一般的な問題のようです。

オブジェクトの書式設定と特定の C タイプの書式設定に満足していたとしても、これはまだ壊れています。誰でもこれを修正できますか?解決策 1.) の実装をすべてのインスタンスで移植可能にすることを強制する傾向があるように思われますが、それは

a.) コーディングに時間がかかる、b.) 効率的でない。

私は本当に詳細なフォーマットを実行できるようにする必要があり、コマンドラインプログラムからこれを印刷した結果は、CSV ファイルまたはパイプラインなどからまったく別のシステムで読み取る必要があります。

フィールド間でも異なる区切り文字を使用したい場合があります-たとえば

....|....;....,....#....^....

そのようにできれば、フォーマット文字列に問題なく埋め込むことができます。

したがって、単一の「結合」セパレーターを使用したフォーマットも答えではありません。

この種のことは Perl で行う方がはるかに簡単です ;-) - しかし - この特定のソフトウェアは Objc++ (C++ ライブラリとリンク) で書かれています。

ご意見やご提案をお待ちしております。

4

1 に答える 1