在Objective-C中声明和检查比较(bitmask-)枚举

在Objective-C中声明和检查比较(bitmask-)枚举,第1张

概述你知道在Cocoa有这个东西,例如你可以创建一个UIView并做: view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 我有一个自定义的UIView与多个状态,我已经定义在一个枚举,像这样: enum DownloadViewStatus { FileNotDow 你知道在Cocoa有这个东西,例如你可以创建一个UIVIEw并做:

vIEw.autoresizingMask = UIVIEwautoresizingFlexibleWIDth | UIVIEwautoresizingFlexibleHeight;

我有一个自定义的UIVIEw与多个状态,我已经定义在一个枚举,像这样:

enum DownloadVIEwStatus {  fileNotDownloaded,fileDownloading,fileDownloaded};

对于每个创建的子视图,我设置其标记:subvIEw1.tag = fileNotDownloaded;

然后,我有一个自定义setter为视图状态,执行以下 *** 作:

for (UIVIEw *subvIEw in self.subvIEws) {  if (subvIEw.tag == vIEwStatus)    subvIEw.hIDden = NO;  else    subvIEw.hIDden = YES;}

但我想要做的是,允许这样:

subvIEw1.tag = fileNotDownloaded | fileDownloaded;

所以我的subvIEw1显示在我的视图的两个状态。目前,它不会出现在这两个状态中的任何一个运算符似乎添加了两个枚举值。

有办法吗?

解决方法 声明位掩码:

除了赋值绝对值(1,2,4,…),你可以声明bitmasks(如何调用它们),如下所示:

typedef enum : NSUInteger {  fileNotDownloaded = (1 << 0),// => 00000001  fileDownloading   = (1 << 1),// => 00000010  fileDownloaded     = (1 << 2)  // => 00000100} DownloadVIEwStatus;

或使用现代ObjC的NS_OPTIONS / NS_ENUM宏:

typedef NS_OPTIONS(NSUInteger,DownloadVIEwStatus) {  fileNotDownloaded = (1 << 0),// => 00000010  fileDownloaded    = (1 << 2)  // => 00000100};

(更多信息,请参见Abizern’s answer)

位掩码的概念是(通常)使用单个位集来定义每个枚举值。

因此,ORing两个值执行以下 *** 作:

DownloadVIEwStatus status = fileNotDownloaded | fileDownloaded; // => 00000101

这相当于:

00000001 // fileNotDownloaded| 00000100 // fileDownloaded----------= 00000101 // (fileNotDownloaded | fileDownloaded)

比较位掩码:

检查位掩码时要记住的一件事:

检查完全相等:

让我们假设状态是这样初始化的:

DownloadVIEwStatus status = fileNotDownloaded | fileDownloaded; // => 00000101

如果要检查状态是否等于fileNotDownloaded,您可以使用:

BOol equals = (status == fileNotDownloaded); // => false

这相当于:

00000101 // (fileNotDownloaded | fileDownloaded)== 00000100 // fileDownloaded-----------=  00000000 // false

检查“成员资格”:

如果要检查状态是否仅包含fileNotDownloaded,您需要使用:

BOol contains = (status & fileNotDownloaded) != 0; // => true   00000101 // (fileNotDownloaded | fileDownloaded)&  00000100 // fileDownloaded-----------=  00000100 // fileDownloaded!= 00000000 // 0-----------=  00000001 // 1 => true

看到细微的差别(以及为什么你当前的“if”表达式可能是错误的)?

总结

以上是内存溢出为你收集整理的在Objective-C中声明和检查/比较(bitmask-)枚举全部内容,希望文章能够帮你解决在Objective-C中声明和检查/比较(bitmask-)枚举所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1047833.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存