我被介绍到目标 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)?
如果我的问题需要进一步解释,请告诉我。