【问题标题】:Use of enum, uint32_t, and bit shifting in Objective C UIFontDescriptor.h constants在 Objective C UIFontDescriptor.h 常量中使用 enum、uint32_t 和位移
【发布时间】:2014-09-07 17:41:57
【问题描述】:

我开始了解 Objective 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;

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

另一个问题,为什么将值创建为移位位而不是普通整数?为什么有些值会跳过位或数字(例如 UIDescriptorClassSlabSerifs 从 5u

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

【问题讨论】:

  • 谷歌搜索不是解决办法,学习一本好的“C”语言书籍真的很有必要。

标签: ios objective-c enums bit-manipulation uint32-t


【解决方案1】:

: uint32_t 指定用于此类型变量的存储大小。 uint_32t 意味着无论架构如何,您都拥有 32 位信息。它是无符号的,因为在有符号整数can produce unexpected results 上旋转位。

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

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

【讨论】:

  • 感谢您的回复。我认为这个答案与我在下面提供的链接相结合有助于更清楚地了解情况。
  • 你能解释一下符号 enum : uint32_t 吗?为什么不使用不带 : 的 enum uint32_t 或不带 : 的 enum unsigned int?或者这是否又与 uint32_t 恰好指定 32 位而 unsigned int 只是 >= 32 位有关。
  • 虽然thing:type 用于其他语言,但在此语法中选择冒号的原因尚不清楚。 uint32_t 定义为始终为 32 位宽。 unsigned int 至少为 16 位,但可能更大,具体取决于平台。
  • 知道了!感谢你的帮助。我会投票,但我还没有足够的声誉来投票,所以我将标记为已解决。
【解决方案2】:

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

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

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

【讨论】:

  • typedef unsigned int uint32_t; 这些是“C”类型,有一整套无符号和有符号,通常在头文件stdint.h 中找到。该数字是存储的位数。对“C”有很好的了解“不会伤害你”
猜你喜欢
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 2010-10-07
  • 2020-11-24
  • 1970-01-01
相关资源
最近更新 更多