2

我被介绍到目标 C 并且对枚举类型有一个温和的理解。

这是我正在关注的教程中使用的一段示例代码:

UIFont *bodyFont = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
UIFontDescriptor *existingDescriptor = [bodyFont fontDescriptor];
UIFontDescriptorSymbolicTraits traits = existingDescriptor.symbolicTraits;
traits |= UIFontDescriptorTraitBold;
UIFontDescriptor *newDescriptor = [existingDescriptor fontDescriptorWithSymbolicTraits:traits];
UIFont *boldBodyFont = [UIFont fontWithFontDescriptor:newDescriptor size:0];

据我了解,bodyFont 是使用 UIFont 的类方法设置的,然后通过从 bodyFont 中提取它来创建 existingDescriptor。然后从中提取现有的 UIFontDescriptorSymbolicTraits 并存储在特征中。

我不明白之后会发生什么(特征| = UIFontDescriptorBold;)从谷歌搜索,我知道这是一个有点明智的比较然后分配,但我不确定为什么必须按照他的方式完成。转到我的下一个问题。

来自 UIFontDescriptor.h 的 API(https://developer.apple.com/library/ios/documentation/uikit/reference/UIFontDescriptor_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UIFontDescriptorSymbolicTraits

typedef enum : uint32_t {
   /* Typeface info (lower 16 bits of UIFontDescriptorSymbolicTraits) */          
   UIFontDescriptorTraitItalic = 1u << 0,
   UIFontDescriptorTraitBold = 1u << 1,
   UIFontDescriptorTraitExpanded = 1u << 5,
   UIFontDescriptorTraitCondensed = 1u << 6,
   UIFontDescriptorTraitMonoSpace = 1u << 10,
   UIFontDescriptorTraitVertical = 1u << 11,
   UIFontDescriptorTraitUIOptimized = 1u << 12,
   UIFontDescriptorTraitTightLeading = 1u << 15,
   UIFontDescriptorTraitLooseLeading = 1u << 16,

   /* Font appearance info (upper 16 bits of UIFontDescriptorSymbolicTraits */
   UIFontDescriptorClassMask = 0xF0000000,

   UIFontDescriptorClassUnknown = 0u << 28,
   UIFontDescriptorClassOldStyleSerifs = 1u << 28,
   UIFontDescriptorClassTransitionalSerifs = 2u << 28,
   UIFontDescriptorClassModernSerifs = 3u << 28,
   UIFontDescriptorClassClarendonSerifs = 4u << 28,
   UIFontDescriptorClassSlabSerifs = 5u << 28,
   UIFontDescriptorClassFreeformSerifs = 7u << 28,
   UIFontDescriptorClassSansSerif = 8u << 28,
   UIFontDescriptorClassOrnamentals = 9u << 28,
   UIFontDescriptorClassScripts = 10u << 28,
   UIFontDescriptorClassSymbolic = 12u << 28
} UIFontDescriptorSymbolicTraits;

符号枚举的含义是什么:uint32_t?我知道 enum 的用法,而且我有点知道 uint32_t 表示无符号 32 位整数(尽管我不确定它与普通的无符号 int 有何不同)。

另一个问题为什么将值创建为移位位而不是普通整数?为什么有些值会跳过位或数字(例如 UIDescriptorClassSlabSerifs 从 5u << 28 变为 7u << 28。或 UIFontDescriptorTraitBold 1u<<1 到 1u<<5)?

如果我的问题需要进一步解释,请告诉我。

4

2 回答 2

2

: uint32_t指定用于此类型变量的存储大小。uint_32t意味着无论架构如何,您都拥有 32 位信息。它是无符号的,因为对有符号整数进行位旋转会产生意想不到的结果

以这种方式指定这些值是为了清楚地表明它们被用作可组合标志;存储在这种类型的变量中的值包含许多信息。1u << 5 1u << 6它比你大脑中的十进制翻译要容易得多。跳过的位要么允许将来扩展,要么对相关标志进行分组,再次是为了便于阅读。

|=运算符不是比较,而是赋值。它类似于+=,它将右手操作数添加到左手并将结果存储回左手。在这种情况下,它执行按位或,设置右侧指定的位。这就是向位掩码添加标志的方式。

于 2014-07-17T02:05:05.290 回答
1

traits |= UIFontDescriptorBold不是比较,只是将 的值位或运算UIFontDescriptorBold到 的值中traits。基本“C”。

enum : uint32_t是一个 Apple 扩展,它导致枚举使用 32 位无符号值uint32_t

1u << 5等用于创建具有一个位集的位值。这允许组合使用各种选项来指定一组选项。可以指定整数值,但出错的可能性更大并且不太清楚。并不是所有的值都需要使用,也许有些值是私有的,或者早期使用过,后来被删除或其他任意原因。

于 2014-07-17T01:58:59.897 回答