2017-04-11 22 views
0

我想在接下来的情况下使用NS_OPTIONS:NS_OPTIONS超过8个值

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 
}; 

而且我有一个警告:

隐式转换损失整数精度:“无符号整型”到“ BOOL”(又名 '符号字符')

去年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 - always NO。 本帖子中的解决方案:64-bit NS_OPTIONS bitmask没有帮助我。我究竟做错了什么?

+0

你应该做'zoo.hasEagle =(registry.animalTypes&FZAnimalTypeEagle)== FZAnimalTypeEagle' – dan

+0

后头部代码定义你的动物园和注册表的结构检查位。 –

+0

的评论,它的工作原理的答案 –

回答

1

的问题是,如registry.animalTypes & FZAnimalTypeBear表达不会导致一个BOOL。它仍然是一个NSUInteger。如果整数的值对于BOOL类型太大,您会收到警告。

你需要改变你的结果是一个实际的BOOL。类似以下内容可以工作:

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

对所有支票进行此更改。

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

+0

@maddy感谢@丹谢谢,它帮助我 –

+0

点澄清:是== true而未== FALSE。这些是可以互换的。但是,将BOOL设置为任意非零值为YES/TRUE是一个坏主意,并且可能会导致非常奇怪的错误。 ('aBool = 6''' if(aBOOL)'评估为真,但'if(aBool == YES)'评估为false。 –

+0

@DuncanC这就是为什么'BOOL'永远不能与'YES'比较的原因或'NO',只要执行'if(aBool)'或'if(!aBool)'。 – rmaddy