我正在阅读苹果文档,以了解如何为iOS格式化文本。我遇到了一个属性字符串,其中大部分都对我有意义。但是,在查找不同类型的属性时,我看到它们都被声明为NSString。 例如:
NSString *const NSFontAttributeName;
NSString *const NSParagraphStyleAttributeName;
...
...
我们在字典中传递这些字符串对象,其值是该特定属性(例如,UIFont对象)。但是,我不明白的是该字符串的内容与属性本身有什么关系。它们只包含属性的名称吗? (即NSFontAttributeName可能包含类似@“NSFontAttribute”的字符串)
肯定有一个原因让苹果选择这样做吗?
编辑:我的问题不是为什么他们使用字符串对象作为字典的键,而是为什么他们使用名为NSFontAttributeName的预定义常量字符串对象而不是允许我们手动传入字符串@“NSFontAttribute”作为键。这就是为什么我想知道他们预定义的字符串对象的内容是否与此有关。
答案 0 :(得分:1)
在这种情况下,Apple使用NSDictionary来包含任意一组键/值对。这样做意味着您具有很大的灵活性,因为您可以使用相同的编程接口没有属性,一个属性或二十几个属性。如果在两年内有可用的属性,您甚至没有考虑过,Apple不必引入任何新的API来支持您设置这些属性。
使用常量而不是字符串文字的原因是,如果拼错名称,编译器可以保存您。如果你写了@“NSFontattribute”而不是@“NSFontAttribute”,编译器就不会知道你弄错了。
答案 1 :(得分:1)
由于属性以NSDictionary
表示,并且您只能在Objective-C集合类中保存Objective-C对象,因此必须使用某种对象。他们可以使用包含在NSNumber
个对象中的枚举整数值,而不是:
typedef enum {
KEYONE,
KEYTWO
} KeyValues;
NSDictionary *attributes = [NSDictionary dictionary];
attributes[@(KEYONE)] = @"The attribute";
使用NSString
作为密钥的一个优点是,以从字符串生成字典密钥哈希的微不足道的代价来调试更容易(这必须比从{{{{}生成字典密钥更加昂贵。 1}} object)。