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