首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在目标C中使用枚举、uint32_t和位移位

在目标C中使用枚举、uint32_t和位移位
EN

Stack Overflow用户
提问于 2014-07-17 01:45:34
回答 2查看 2.3K关注 0票数 2

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

下面是在下面的教程中使用的一段示例代码:

代码语言:javascript
复制
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;),我知道这是一个明智的比较,然后是分配,但我不知道为什么要按他的方式去做。回答我的下一个问题。

来自于UIFonDescriptor.h (ref/UIFontDescriptorSymbolicTraits)的API

代码语言:javascript
复制
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的含义是什么?我知道枚举的用法,我也知道uint32_t的意思是无符号32位整数(虽然我不知道它与普通的无符号int有什么不同)。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-17 02:05:05

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

这些值是以这种方式指定的,以明确它们被用作可组合标志;存储在此类型变量中的值包含许多信息。在你的大脑中,读和写1u << 5 1u << 6比从十进制翻译要容易得多。跳过的位要么是为了允许将来的扩展,要么是为了分组相关的标志,同样是为了可读性。

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

票数 2
EN

Stack Overflow用户

发布于 2014-07-17 01:58:59

traits |= UIFontDescriptorBold不是一个比较,只是将UIFontDescriptorBold的值与traits的值相比较。基本"C“

enum : uint32_t是苹果的扩展,它导致枚举使用32位无符号值uint32_t

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24793590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档