2017-04-11 46 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