我将被介绍给 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中提取出来的方法来创建existDescriptor。然后从中提取现有的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位无符号整数(尽管我不确定它与普通的unsigned int有何不同)。另一个问题,为什么将值创建为移位位而不是普通整数?为什么有些值会跳过位或数字(例如,UIDescriptorClassSlabSerifs从5u 如果我的问题需要进一步说明,请告诉我。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 : uint32_t指定用于此类型的变量的存储空间的大小。 uint_32t意味着无论体系结构如何,您都只拥有32位信息。它是无符号的,因为位在有符号的整数can produce unexpected results上摆动。以这种方式指定值以使其清楚地表明它们已被用作可组合标志。存储在这种类型的变量中的值包含许多信息。读写1u << 5 1u << 6比从大脑中的十进制转换要容易得多。跳过的位要么是为了将来的扩展,要么是将相关标志分组,以提高可读性。|=运算符不是比较,而是赋值。它与+=相似,后者将右侧操作数添加到左侧,并将结果存储回左侧。在这种情况下,它将执行按位“或”运算,该运算将设置在右侧指定的位。这是将标志添加到位掩码的方式。 (adsbygoogle = window.adsbygoogle || []).push({});
08-27 10:30