首页 > 学院 > 开发设计 > 正文

NS_ENUM和NS_OPTIONS

2019-11-08 00:15:39
字体:
来源:转载
供稿:网友

下面来简单的解释一下OC里枚举的两种类型.NS_ENUMNS_OPTIONS本质上是一样的都是枚举.我举个例子. 

typedef NS_ENUM(NSInteger, UIViewAnimationTransition) { UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFromLeft, UIViewAnimationTransitionFlipFromRight, UIViewAnimationTransitionCurlUp, UIViewAnimationTransitionCurlDown,};typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutoresizingFlexibleWidth = 1 << 1, UIViewAutoresizingFlexibleRightMargin = 1 << 2, UIViewAutoresizingFlexibleTopMargin = 1 << 3, UIViewAutoresizingFlexibleHeight = 1 << 4, UIViewAutoresizingFlexibleBottomMargin = 1 << 5};

应该可以看出一些苗头. 

NS_ENUM这种声明出来的东西大部分是单选. NS_OPTIONS声明出来的大部分是多选. 

像UIViewAnimationTransition这种在用的时候肯定是只能选一种效果,你要么从左翻到右,要么从右翻到左,你做动画的时候总不能同一时刻让他同时从左到右,又从右到左翻,对吧. 

而UIViewAutosizing就不一样了.我要是让子view的宽高和父View一样,那么autoviewsizing的选项肯定是类似于这种.UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight没错吧,意思就是两个options的我都得选才行. 

那么如果有个场景让我判断当前的view的Autoresizing有哪几个.我怎么判断呢? 

很简单.用按位与操作就行了.假设 autoResizings = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin;

我们判断autoResizings里是否有UIViewAutoresizingFlexibleLeftMargin的时候只需要if(autoResizings & UIViewAutoresizingFlexibleLeftMargin)是否为true就可以了.用二进制表示的话(这里不用care NSUInteger到底是几位的.就表示这么个意思)UIViewAutoresizingFlexibleLeftMargin = 00000001UIViewAutoresizingFlexibleWidth = 00000010UIViewAutoresizingFlexibleRightMargin = 00000100 

所以根据上面的表达式,我们的autoResizings = 00000111.那么执行按位与操作是这样的.

00000111&00000001 结果就是00000001,为true.表示含有这个选项.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表