我有一个不同对象的 NSArray,例如一个 NSString 和一个 NSNumber 整数。
我有一个特定的格式字符串,我想用它来打印对象内容,而不仅仅是使用
@"%@|%@"
但是,例如
@"%-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 类型。
我有两个问题和一些关于解决方案的想法,但不想在这里重新发明轮子。
1.) 我可以通过切换从 className 派生的类型来遍历 NSArray 项 - 当然 - 但我想知道是否有标准的方法来做到这一点。
这也意味着将格式字符串解构为单独的 % 实体(或将其作为数组传递并通过它进行处理 - 不是很干净,并且需要保留任何其他非格式化条目,如上面的管道分隔符)。
2.) 使用@"%@|%@" 的上述代码在 32 位 Linux 上使用 gcc / objc / objc++ 4.6.X 及更高版本,但在 64 位 Linux 上会出现段错误,我需要让它运行两个都。
根据我的阅读,这似乎是一些 Linux 系统上 va_list 的 64 位实现的一个相当普遍的问题。
即使我对对象格式感到满意,与特定的 C 类型格式相比,这仍然是错误的。有没有人可以解决这个问题?似乎它倾向于强制实施解决方案 1.) 在每种情况下都是可移植的,但那是
a.) 编码耗时 b.) 效率不高。
我真的需要能够进行详细的格式化以及从命令行程序打印的结果需要由完全不同的系统作为 CSV 文件或管道等读取。
我可能也想在字段之间使用不同的分隔符 - 例如
....|....;....,....#....^....
如果我能那样做,我会很好地嵌入我的格式字符串中。
因此,任何带有单个“连接”分隔符的格式也不是答案。
在 Perl 中做这种事情要容易得多 ;-) - 但是 - 这个特定的软件是用 Objc++ 编写的(与 C++ 库链接)。
感谢您的想法和建议。