我想要获得使用
举例来说,对于用
在这种情况下,API 看起来像
-- 编辑 --
鉴于这个问题已经三年了,目前我会接受仅 C 的实现。
+[NSString stringWithFormat:]
创建的 NSString
成员范围。如何解析 Objective-C 格式字符串是最佳方法?我不能只使用 C 格式字符串解析器,因为它无法处理 %@
。我还需要确保它支持格式排序: %1$d
,%2$@
等。举例来说,对于用
[NSString stringWithFormat:@"foo %2$@ bar %1$@", @"Heath", @"Borders"]
创建的字符串,我希望得到以下 NSArray
: @[NSMakeRange(15, 5), NSMakeRange(4, 6)]
。第一个数组对象对应于格式字符串中的第一个数据元素,第二个数组对象对应于第二个数据元素,以此类推。在这种情况下,API 看起来像
+ (NSString *)stringWithFormatRanges:(NSArray **)outFormatRanges withFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
它将返回与 +[NSString stringWithFormat:]
类似的 NSString
,但它还将返回一个包含每个格式数据元素的 NSRange
的 NSArray
。 -- 编辑 --
鉴于这个问题已经三年了,目前我会接受仅 C 的实现。
printf()
的%n
specifier 在 Objective-C 中是否按预期工作?如果是这样的话,编写一个围绕stringWithFormat
的包装器,立即在其他 specifiers 之前和之后注入%n
,调用格式化程序,然后将字节计数后处理为所需的任何形式就像编写简单的代码一样。 - Iwillnotexist Idonotexist%n
!然而,“编写一个围绕stringWithFormat
的包装器,在其他说明符之前和之后立即注入%n
”似乎一点也不简单。说明符语法非常复杂!:( - Heath Borders%n
是否适用于stringWithFormat
,而“大约简单”只是对复杂性的上限进行了界定。但我认为,用%n
包装说明符可能会比实现自己的格式化打印机或在打印后对字符串进行疯狂分析要稍微容易一些。此外,解析规范是否就像扫描未转义的%
,然后扫描规范的下一个“终止”字母之一,其中包括@diuoxXeEfFgGaAcspn
?在两者之间,您可以使用其他字符,但据我所知不能使用那些字符。 - Iwillnotexist Idonotexistprintf()
的描述使用了一组不相交的字符来表示转换说明符和介于其间的内容(_标志、字段宽度、精度、长度修饰符_)。让我困扰的是%@
转换说明符可能不被普通的printf()
支持,但%n
可能不被stringWithFormat
支持。 - Iwillnotexist Idonotexist