gpt4 book ai didi

ios - Objective C 中的位掩码

转载 作者:IT王子 更新时间:2023-10-29 07:58:28 24 4
gpt4 key购买 nike

我想学习位掩码。据我理解,它是指将某种类型的二进制值存储到一个变量中。

如果上述假设成立,我想我可以做这样的事情:

typedef NSUInteger Traits;

enum
{
TraitsCharacterHonest = 0,
TraitsCharacterOptimistic = 1,
TraitsCharacterPolite = 4,
TraitsCharacterDevious = 8,
TraitsPhysicalTall = 16,
TraitsPhysicalBeautiful = 32,
TraitsPhysicalFat = 64,
TraitsPhysicalBigEyes = 128,
TraitsPhysicalRedHair = 256,
};

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (strong, nonatomic) NSString *name;
@property (assign, nonatomic) Traits *traits;

@end

问题 1 是,如何将更多特征分配给一个人?

问题 2 是,我是否必须将不断增加的数字放入枚举项中,或者有没有办法表明这一点?

最终我想实现这样的目标:

Person *john = [[Person alloc] init];

//here code that assigns john three traits: TraitsCharacterHonest,
//TraitsCharacterOptimistic and TraitsPhysicalBeautiful.

如果我没理解错的话,

的值(value)

john.traits 应该是 100011.,从右边开始读,每个地方代表那个特定的枚举值/特征.. 0 表示没有它,1 表示有它。

您能否就语法提出建议并在需要时解释特定方面?

最佳答案

我建议更改一些内容:

  • 枚举值可以更改为左移一个。在我看来,它更容易编写。

  • 您不需要对 NSUInteger 进行 typedef,您可以直接使用 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...

此外,删除特征等操作的语法令人困惑。你必须使用 & 和一个 NOT-ed 常量,

// 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);

你会得到合理的输出。

关于ios - Objective C 中的位掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12339833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com