【问题标题】:NS_OPTIONS with more than 8 valuesNS_OPTIONS 超过 8 个值
【发布时间】:2017-04-11 15:28:23
【问题描述】:

我正在尝试在下一个案例中使用 NS_OPTIONS:

typedef NS_OPTIONS(NSUInteger, FZAnimalType) {
    FZAnimalTypeNone = 0,
    FZAnimalTypeBear = 1 << 0,
    FZAnimalTypeFox = 1 << 1,
    FZAnimalTypeWolf = 1 << 2,
    FZAnimalTypeTiger = 1 << 3,
    FZAnimalTypeLion = 1 << 4,
    FZAnimalTypeRabbit = 1 << 5,
    FZAnimalTypeGoat = 1 << 6,
    FZAnimalTypeParrot = 1 << 7,
    FZAnimalTypeDog = 1 << 8,
    FZAnimalTypeCat = 1 << 9,
    FZAnimalTypeSheep = 1 << 10,
    FZAnimalTypeEagle = 1 << 11 
};

我有一个警告:

隐式转换丢失整数精度:“unsigned int”到“BOOL”(又名“signed char”)

在以下代码的最后 4 行:

zoo.hasBear = registry.animalTypes & FZAnimalTypeBear;
zoo.hasFox = registry.animalTypes & FZAnimalTypeFox;
zoo.hasWolf = registry.animalTypes & FZAnimalTypeWolf;
zoo.hasTiger = registry.animalTypes & FZAnimalTypeTiger;
zoo.hasLion = registry.animalTypes & FZAnimalTypeLion;
zoo.hasRabbit = registry.animalTypes & FZAnimalTypeRabbit;
zoo.hasGoat = registry.animalTypes & FZAnimalTypeGoat;
zoo.hasParrot = registry.animalTypes & FZAnimalTypeParrot;
zoo.hasDog = registry.animalTypes & FZAnimalTypeDog;
zoo.hasCat = registry.animalTypes & FZAnimalTypeCat;
zoo.hasSheep = registry.animalTypes & FZAnimalTypeSheep;
zoo.hasEagle = registry.animalTypes & FZAnimalTypeEagle;

而属性 hasDog/hasCat/hasSheep/hasEagle - 总是 NO。 这篇文章中的解决方案:64-bit NS_OPTIONS bitmask 没有帮助我。我做错了什么?

【问题讨论】:

  • 你应该通过zoo.hasEagle = (registry.animalTypes &amp; FZAnimalTypeEagle) == FZAnimalTypeEagle来检查位
  • 发布定义您的动物园和注册表结构的标头代码。
  • @dan 感谢您的评论,它有效

标签: ios objective-c


【解决方案1】:

问题是registry.animalTypes &amp; FZAnimalTypeBear 这样的表达式不会导致BOOL。它仍然是NSUInteger。如果整数的值对于BOOL 类型来说太大,则会收到警告。

您需要将结果更改为实际的BOOL。类似以下的方法会起作用:

zoo.hasEagle = (registry.animalTypes & FZAnimalTypeEagle) != 0;

对您的所有支票进行此项更改。

要记住BOOL 的另一件事是,最好只使用YESNO 作为可能的值。尽量不要将任意整数值分配给 BOOL 类型。

【讨论】:

  • 澄清点:YES == TRUE 和 NO == FALSE。这些是可以互换的。但是,是的,将 BOOL 设置为任意非零值作为 YES/TRUE 是一个坏主意,并且可能会导致非常奇怪的错误。 (aBool = 6.if (aBOOL) 评估为真,但if (aBool == YES) 评估为假。
  • @DuncanC 这就是为什么不应将BOOLYESNO 进行比较的原因。只需执行if (aBool)if (!aBool)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2012-08-21
  • 2014-08-07
  • 2018-08-08
  • 1970-01-01
相关资源
最近更新 更多