ios:关于枚举

在计算机科学理论中,枚举是一个被命名的整型常数的集合。定义形式如下:

enum 枚举名{
             标识符[=整型常数],
             标识符[=整型常数],
             ...
             标识符[=整型常数],
        } 枚举变量;
内存空间上,enum是枚举型 union是共用体,成员共用一个变量缓冲区。它不参加内存的占用和释放,枚举定义的变量可直接使用,甚至不用初始化。如果枚举没有初始化,则从第一个标识符开始,顺次赋给标识符0, 1, 2, ...。下面示例枚举中 n1,n2,n3,n4分别为0,1,2,3
enum NSInteger{n1, n2, n3, n4}x; 
但当枚举中的某个成员赋值后,其后的成员按依次 加1的规则确定其值。
enum NSInteger
{
    n1,
    n2 = 0,
    n3 = 10,
    n4
}x; 
上面枚举示例中,n1,n2,n3,m4 分别为0,0,10,11。
1. 枚举中每个成员(标识符)结束符是",", 不是";", 最后一个成员可省略 ","。2. 初始化时可以赋负数,以后的标识符仍依次加1。 3. 枚举变量只能取枚举说明结构中的某个标识符常量,例如此时n4=11.

虽然枚举类型被定义为一个整型集合,但是我测试还是可以定义成字符串,声明如下:

typedef enum : NSUInteger { blackColor, redColor, yellowColor } ThreeColor;

但是用法与整型枚举有些区别,它不能像整型直接使用,直接输出永远是0,需要写一个方法进行转换你需要的字符串。
- (NSString*) colorConvertToString:(ThreeColor) aColor {
    NSString *result = nil;

    switch(aColor) {
        case blackColor:
            result = @"black";
            break;
        case redColor:
            result = @"red";
            break;
        case yellowColor:
            result = @"yellow";
            break;

        default:
            result = @"unknown";
    }

    return result;
}
打印结果:
NSLog(@"%@",[self colorConvertToString:redColor]);
red
但一直觉得字符串枚举没有什么意义,从来没有用过。

枚举还支持位运算,比如在UIView类里面看到这样的定义。
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
};
1<<0,0表示不进行移位 1还是1;大于1的会进行移位所以十进制的值分别是
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,          //十进制,指定的位数,二进制
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,     //1,0,01
    UIViewAutoresizingFlexibleWidth        = 1 << 1,     //2,1,10       转换成 十进制  2
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,     //4,2,100      转换成 十进制  4
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,     //8,3,1000     转换成 十进制  8
    UIViewAutoresizingFlexibleHeight       = 1 << 4,     //16,4,10000   转换成 十进制  16
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5      //32,5,100000  转换成 十进制  32
};
位运算的计算方式是将二进制转换成十进制,也就是说,枚举值里面存取的是 计算后的十进制值.但是注意字符串枚举不适用于位运算。

所以在代码中下面这样写是没有任何区别的。
    [UIButton buttonWithType:UIButtonTypeCustom];
    [UIButton buttonWithType:0];
枚举之间还可以这样写:(UIApplication.h)
typedef NS_OPTIONS(NSUInteger, UIInterfaceOrientationMask) {
    UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
    UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
    UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
    UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
    UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
    UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
    UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
};
有时候,常说枚举一个数组,这里枚举其实是遍历的意思。在ios中为我们提供了一个枚举的类。(NSEnumerator.h)
@protocol NSFastEnumeration

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len;

@end

@interface NSEnumerator : NSObject <NSFastEnumeration>

- (id)nextObject;

@end

@interface NSEnumerator (NSExtendedEnumerator)

@property (readonly, copy) NSArray *allObjects;

@end
集合类(如:NSArray、NSSet、NSDictionary等)均可获取到NSEnumerator, 该类是一个抽象类,没有用来创建实例的公有接口。NSEnumerator的nextObject方法可以遍历每个集合元素,结束返回nil,通过与while结合使用可遍历集合中所有项。
示例:
NSArray *anArray = // ... ;
NSEnumerator *enumerator = [anArray objectEnumerator];
id object;

while ((object = [enumerator nextObject])) {
    // do something with object...
}
遍历数组每个索引处的对象,你可以编写一个0到[array count]的循环,而NSEnumerator用来描述这种集合迭代运算的方式。

通过objectEnumerator向数组请求枚举器,如果想从后向前浏览集合,可使用reverseObjectEnumerator方法。在获得枚举器后,可以开始一个while循环,每次循环都向这个枚举器请求它的下一个对象:nextObject。nextObject返回nil值时,循环结束。
也可以自定义枚举器,要实现快速枚举就必须实现NSFastEnumeration协议,也就是
- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len;
并且覆盖nextObject方法。
				
时间: 2024-08-29 00:14:42

ios:关于枚举的相关文章

iOS/object-c: 枚举类型 enum,NS_ENUM,NS_OPTIONS

一般情况下,我们采用C风格的enum关键字可以定义枚举类型. [cpp] view plaincopy enum{ UIViewAnimationTransitionNone, UIViewAnimationTransitionFlipFromLeft, UIViewAnimationTransitionFlipFromRight, UIViewAnimationTransitionCurlUp, UIViewAnimationTransitionCurlDown, } UIViewAnimat

ios定义枚举

枚举其实很重要,特别是在应用开发初期,服务器端数据格式需要更改得情况下,枚举和宏都能是程序简洁,并且改动小. 网上有个人写的言简意赅,适合初学 转自:http://blog.csdn.net/ysy441088327/article/details/8012677 题记: 蛋疼的枚举, 千万别小视了! 进入正题: 首先要知道的是,枚举值 它是一个整形(int) 并且,它不参加内存的占用和释放 枚举定义变量即可直接使用,不用初始化. 枚举的定义如下: typedef enum { //以下是枚举成

ios对于枚举的使用

引言: 枚举值 它是一个整形(int)  并且,它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化. 在代码中使用枚举的目的只有一个,那就是增加代码的可读性. 使用: 枚举的定义如下: [csharp] view plaincopy typedef enum { //以下是枚举成员 TestA = 0, TestB, TestC, TestD }Test;//枚举名称 亦可以如下定义(推荐:结构比较清晰): [csharp] view plaincopy typedef NS_ENU

6、iOS快速枚举

今天在写程序的时候想在当前视图跳转的时候释放掉当前视图上面add的一些子视图.因为add的子视图有些是在别的类里面add进来的,当前页面不知道自己当前有哪几个类型的子视图.这样,我就想到了用循环遍历来查看当前视图有没有符合条件的子视图,如果有的话就释放掉. 我是这样写的: for(UIView * subView in self.view.subviews) { if([subView isKindOfClass:[XYZSeniorQueryView class]]) { [subView r

iOS 关于枚举的使用

引言: http://blog.csdn.net/ysy441088327/article/details/8012677 枚举值 它是一个整形(int)  并且,它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化. 在代码中使用枚举的目的只有一个,那就是增加代码的可读性. 使用: 枚举的定义如下: [csharp] view plaincopy typedef enum { //以下是枚举成员 TestA = 0, TestB, TestC, TestD }Test;//枚举名称

iOS枚举的运用

1.什么是枚举? 枚举其实就是一个整型常数的集合,最简单的例子就是表示星期的SUN, MON, TUE, WED, THU, FRI,SAT, 就是一个枚举. 2.iOS中枚举的使用 在ObjC中可以使用C语言的方式进行枚举,其实ObjC的枚举就是在C语言上演化而来,先了解C语言定义一个枚举的方式有助于我们对枚举的理解. 下面我们定义一个枚举类型Animal,形式为 enum 枚举名{ 枚举值表 };   我们在名为Animal的枚举中申明了多个成员名,我们可以看作是整形常量的别名.我们把cat

iOS6 及其以上版本自动旋转、手动强制旋转方案及布局适配

1.布局适配方式 本文不讨论哪种布局适配方式最好,此处使用的是 Masonry 纯代码布局适配.(Masonry 底层就是 AutoLayout 的 NSLayoutConstraint) 2.iOS 方向枚举类 // 三维设备方向 typedef NS_ENUM(NSInteger, UIDeviceOrientation) { UIDeviceOrientationUnknown, UIDeviceOrientationPortrait, // Device oriented vertica

Swift学习之enum、struct、class的异同详解

由于在开发过程中常常需要用到系统提供的基础类型之外的的类型,因此Swift开发中我们可以根据自己的需要构建属于自己的类型系统以便于更加灵活和方便的开发程序并将其称之为named types.Swift主要为我们提供了以下四种named types 分别是:enum.struct.class和protocol, 相信熟悉objective-c开发的同学们对于iOS中枚举.结构体和类的概念一点都不陌生.相比于前辈objective-c中的这三者,Swift将enum和struct变得更加灵活且强大,

ReactiveSwift源码解析(一) Event与Observer代码实现

ReactiveCocoa这个框架是做什么用的本篇博客就不做过多赘述了,什么是"响应式编程"也不多聊了,自行Google吧.本篇博客的主题是解析ReactiveCocoa框架中的核心模块ReactiveSwift中的两个核心类的实现,也就是对Event和Observer这两个类进行解析.之所以把这两个类放在一块聊,是因为这两个类比较独立,可以说是ReactiveSwift中的两个原子类.Event确切的说是一个枚举,其中有几种事件,而Observer类的对象就是这些事件的发送者.所以把