我建议更改一些内容:
枚举值可以更改为左移一个。在我看来,让写作更容易一些。
你不需要 typedef 到 NSUInteger,你可以直接使用typedef enum.
而且,正如其他人所提到的,您的属性不应该是指向 Traits 类型的指针。
我的代码如下所示:
typedef enum
{
TraitsCharacterHonest = 1 << 0,
TraitsCharacterOptimistic = 1 << 1,
TraitsCharacterPolite = 1 << 2,
TraitsCharacterDevious = 1 << 3,
TraitsPhysicalTall = 1 << 4,
TraitsPhysicalBeautiful = 1 << 5,
TraitsPhysicalFat = 1 << 6,
TraitsPhysicalBigEyes = 1 << 7,
TraitsPhysicalRedHair = 1 << 8
} Traits;
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (strong, nonatomic) NSString *name;
@property (assign, nonatomic) Traits traits;
@end
设置 John 的特征将如下所示:
Person *john = [[Person alloc] init];
john.traits = TraitsCharacterHonest | TraitsCharacterOptimistic | TraitsPhysicalBeautiful;
然而,虽然位域对学习很有用,但调试起来确实很痛苦。如果你现在想去打印这个角色的特征,你必须编写如下代码:
NSMutableString *result = [NSMutableString string];
if (self.traits & TraitsCharacterHonest)
{
[result appendString: @"Honest, "];
}
if (self.traits & TraitsCharacterOptimistic)
{
[result appendString: @"Optimistic, "];
}
if (self.traits & TraitsCharacterPolite)
{
[result appendString: @"Polite, "];
}
// etc...
此外,删除特征等操作的语法令人困惑。你必须使用&和一个未编辑的常量,
// remove 'Tall' trait
john.traits = john.traits & ~TraitsPhysicalTall
如果可以(并且性能不是太大问题),我更喜欢使用更高级别的功能。也许是一个带有字符串常量的 NSSet?例如
__unused static NSString *TraitsCharacterHonest = @"TraitsCharacterHonest";
__unused static NSString *TraitsCharacterOptimistic = @"TraitsCharacterOptimistic";
__unused static NSString *TraitsCharacterPolite = @"TraitsCharacterPolite";
// etc...
@interface Person : NSObject
@property (strong, nonatomic) NSString *name;
@property (assign, nonatomic) NSMutableSet *traits;
@end
然后你可以这样做:
// adding
[john.traits addObject: TraitsCharacterHonest];
// checking
[john.traits containsObject: TraitsCharacterHonest];
// removing
[john.traits removeObject: TraitsCharacterHonest];
对我来说更有意义。更重要的是,您可以直接打印特征的描述
NSLog(@"John's traits: %@", john.traits);
你会得到合理的输出。