NSFontAttributeName 等字符属性的内容是什么?

What is the content of character attributes like NSFontAttributeName?

我正在阅读苹果文档以了解如何为 iOS 设置文本格式。我遇到了一个属性字符串,其中大部分对我来说都很有意义。然而,在查找不同种类的属性时,我看到它们都被声明为 NSString。 例如:

NSString *const NSFontAttributeName;
NSString *const NSParagraphStyleAttributeName;
...
...

我们在字典中传递这些字符串对象,其值为该特定属性(例如,UIFont 对象)。但是,我不明白的是该字符串的内容与属性本身有什么关系。它们只包含属性的名称吗? (即 NSFontAttributeName 可能包含类似 @"NSFontAttribute" 的字符串)

苹果选择这样做肯定是有原因的吧?

编辑:我的问题不是关于为什么他们使用字符串对象作为字典的键,而是为什么他们使用名为 NSFontAttributeName 的预定义常量字符串对象而不是让我们手动传入字符串 @"NSFontAttribute" 作为关键。这就是为什么我想知道他们预定义的字符串对象的内容是否与此有关。

在这种情况下,Apple 使用 NSDictionary 来包含任意一组 key/value 对。这样做意味着您有很大的灵活性,因为您可以没有属性、一个属性或两个具有相同编程接口的属性。如果两年后有可用的属性,你甚至都没有想过,Apple 也不需要引入任何新的 API 来支持你设置这些属性。

之所以使用常量而不是字符串文字,是因为如果您拼错了名称,编译器可以救您一命。如果你写的是@"NSFontattribute"而不是@"NSFontAttribute",编译器就不会知道你弄错了。

由于属性在 NSDictionary 中表示,并且您只能在 Objective-C 集合 类 中保存 Objective-C 个对象,因此您必须使用某种对象.他们本可以使用枚举整数值,包装在 NSNumber 个对象中,而不是:

typedef enum {
    KEYONE,
    KEYTWO
} KeyValues;

NSDictionary *attributes = [NSDictionary dictionary];
attributes[@(KEYONE)] = @"The attribute";

使用 NSString 作为键的一个优点是它更容易调试,只需从字符串中生成字典键散列(这肯定比从NSNumber 对象)。