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-)枚举所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)