【发布时间】:2011-09-22 21:23:01
【问题描述】:
我有一个自定义类(它在概念上类似于 NSArray,并且希望是格式化的外观),它有一个 description 格式化程序。
当格式化程序的输出本身被打印(NSLog)时,它看起来很好,但是当它作为 NSDictionary description 的元素包含时,NSDictionary 格式化程序似乎决定它是一个字符串,而不是结构定义,将其括在引号中,并转义字符串中的所有控制字符。
当然,对于标准的 NSArray,它不会这样做,所以我想知道它是如何决定以一种方式处理字符串而不是另一种方式的。
例如,而不是输出看起来像:
theChildren = (
{
"@meta.type" = "ns3:location";
"childNumber" = 0;
...
看起来像:
theChildren = "( \n\t\t {\n\t \"@meta.type\" = \"ns3:location\";\n\t \"childNumber\" = 0;
...
谁能提出改变这种行为的方法?
FWIW,我在 NSMutableString 中累积描述字符串(数据主要由调用 NSDictionary description 的结果组成),然后在出口处执行 NSString stringFromString(尽管我不知道它有什么作用)。
添加
我想我在 NSDictionary 的文章中找到了答案(尚未检查):
讨论
返回的 NSString 对象包含 字典的每个条目。 descriptionWithLocale:缩进: 获取给定键或值的字符串表示形式,如下所示:
If the object is an NSString object, it is used as is. If the object responds to descriptionWithLocale:indent:, that调用方法来获取对象的字符串表示。
If the object responds to descriptionWithLocale:, that method is调用以获取对象的字符串表示形式。
If none of the above conditions is met, the object’s string表示是通过调用其描述方法获得的。
更新
好吧,事实证明他们在撒谎。我实现了 descriptionWithLocale:indent: 并且它永远不会被调用。
9 月 23 日更新
有趣的是,如果我让我的类成为 NSArray 的子类,那么 NSDictionary 会调用 descriptionWithLocale:indent: 并且它的格式正确。听起来 NSDictionary 是在“作弊”和测试 isKindOfClass 而不是 respondsToSelector,否则只是对非 NS 的东西有偏见。
但是,在获取许多我不想模仿的行为以及携带额外未使用的数据方面,必须将 NSArray 子类化有点难看。
等
另一种选择是将转义的字符串转换回其原始字符串。这需要一个 31 行的过程来处理基础知识(\n、\t、\" 和 \\)。好处是我不需要继承 NSArray。主要的缺点是这个例程必须插入到任何可以显示我的类的 NSLog 调用中。另一个小缺点是转义的字符串被我无法消除的引号字符包装,但这几乎不引人注意。
现在知道#ifdefed -- 不确定我会选择哪个。
【问题讨论】:
-
您应该将其添加为答案!
-
不幸的是它不是答案。
-
是的,你可以回答你自己的问题。当您在询问时知道答案时通常不是很好的形式,但如果您在等待时发现答案 - 请继续添加!
-
@Daniel 要么是 Cocoa (Touch) 错误,要么是文档错误。 File a radar.
标签: iphone objective-c ios formatting