我被介绍给目标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;),我知道这是一个明智的比较,然后是分配,但我不知道为什么要按他的方式去做。回答我的下一个问题。
来自于UIFonDescriptor.h (ref/UIFontDescriptorSymbolicTraits)的API
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)?
如果我的问题需要进一步解释,请告诉我。
发布于 2014-07-17 02:05:05
: uint32_t指定用于此类型变量的存储空间的大小。uint_32t意味着无论架构如何,您都有32位的信息。它是无符号的,因为有符号整数can produce unexpected results上的位旋转。
这些值是以这种方式指定的,以明确它们被用作可组合标志;存储在此类型变量中的值包含许多信息。在你的大脑中,读和写1u << 5 1u << 6比从十进制翻译要容易得多。跳过的位要么是为了允许将来的扩展,要么是为了分组相关的标志,同样是为了可读性。
|=运算符不是比较,而是赋值。它类似于+=,它将右边的操作数添加到左侧,并将结果存储回后者。在这种情况下,它执行按位或,它设置在右侧指定的位。这就是如何将标志添加到位掩码中。
发布于 2014-07-17 01:58:59
traits |= UIFontDescriptorBold不是一个比较,只是将UIFontDescriptorBold的值与traits的值相比较。基本"C“
enum : uint32_t是苹果的扩展,它导致枚举使用32位无符号值uint32_t。
1u << 5等被用来创建一个位集的位值。这允许组合使用各种选项来指定一组选项。可以指定整数值,但出错的可能性更大,并且不太清楚。并不是所有的值都需要使用,也许sone是私有的,或者是早期使用的,或者是以后删除的,或者是另一个任意的原因。
https://stackoverflow.com/questions/24793590
复制相似问题