我不认为我从根本上理解enum是什么,以及何时使用它。

例如:

typedef enum {kCircle,kRectangle,kOblateSpheroid
} ShapeType;

这里真的被宣布了什么?


#1楼

Apple建议在Xcode 4.4之后定义这样的枚举:

typedef enum ShapeType : NSUInteger {kCircle,kRectangle,kOblateSpheroid
} ShapeType;

它们还提供了一个方便的宏NS_ENUM:

typedef NS_ENUM(NSUInteger, ShapeType) {kCircle,kRectangle,kOblateSpheroid
};

这些定义提供更强的类型检查和更好的代码完成。 我找不到NS_ENUM的官方文档,但您可以在此处观看WWDC 2012会议中的“Modern Objective-C”视频。

UPDATE:链接到官方文档在这里 。


#2楼

枚举(枚举的缩写)用于枚举一组值(枚举器)。 值是由符号(单词)表示的抽象事物。 例如,一个基本的枚举可能是

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl };

此枚举称为匿名,因为您没有用于命名它的符号。 但它仍然是完全正确的。 就这样使用它

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;

好。 生活很美好,一切顺利。 但有一天你需要重用这个枚举来定义一个新变量来存储myGrandFatherPantSize,然后你写:

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandFatherPantSize;

但是你有一个编译器错误“重新定义枚举器”。 实际上,问题是编译器不确定你是第一次枚举而你是第二次描述同样的事情。

然后,如果要在多个位置重用同一组枚举器(此处为xs ... xxxxl),则必须使用唯一名称对其进行标记。 第二次使用此设置时,您只需使用标签。 但是不要忘记这个标签不会取代枚举词,而只会取代枚举器集。 然后像往常一样注意使用枚举。 像这样:

// Here the first use of my enum
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
// here the second use of my enum. It works now!
enum sizes myGrandFatherPantSize;

您也可以在参数定义中使用它:

// Observe that here, I still use the enum
- (void) buyANewDressToMyGrandMother:(enum sizes)theSize;

你可以说在任何地方重写枚举都不方便,并使代码看起来有点奇怪。 你是对的。 真正的类型会更好。

这是我们进入峰会的最后一步。 通过添加一个typedef,让我们将enum转换为真实类型。 哦,最后一件事,你的班级不允许使用typedef。 然后在上面定义您的类型。 像这样做:

// enum definition
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl };
typedef enum sizes size_type@interface myClass {...size_type myGrandMotherDressSize, myGrandFatherPantSize;...
}

请记住,标签是可选的。 那么从这里开始,在这种情况下,我们不会标记枚举数,只是为了定义一个新类型。 然后我们不再需要它了。

// enum definition
typedef enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } size_type;@interface myClass : NSObject {...size_type myGrandMotherDressSize, myGrandFatherPantSize;...
}
@end

如果您使用XCode在Objective-C中进行开发,我可以让您发现一些以NS_ENUM为前缀的漂亮宏。 这应该可以帮助您轻松定义好的枚举,而且还有助于静态分析器在编译之前为您做一些有趣的检查。

好恩生!


#3楼

typedef对于重新定义现有变量类型的名称很有用。 它提供了调用数据类型的简短而有意义的方法。 例如:

typedef unsigned long int TWOWORDS;

这里,unsigned long int类型被重新定义为TWOWORDS类型。 因此,我们现在可以通过写入声明unsigned long int类型的变量,

TWOWORDS var1, var2;

代替

unsigned long int var1, var2;

#4楼

typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;

然后你可以使用它像: -

 ShapeType shape;

 enum {kCircle,kRectangle,kOblateSpheroid
}
ShapeType;

现在你可以使用它: -

enum ShapeType shape;

#5楼

更新64位更改:根据有关64位更改的Apple文档 ,

枚举也是类型的:在LLVM编译器中,枚举类型可以定义枚举的大小。 这意味着某些枚举类型的大小也可能比您预期的大。 与所有其他情况一样,解决方案是不对数据类型的大小做出任何假设。 而是将任何枚举值分配给具有适当数据类型的变量

因此,如果支持64位,则必须使用以下语法创建枚举

typedef NS_ENUM(NSUInteger, ShapeType) {kCircle,kRectangle,kOblateSpheroid
};

要么

typedef enum ShapeType : NSUInteger {kCircle,kRectangle,kOblateSpheroid
} ShapeType;

否则,它将导致警告,因为Implicit conversion loses integer precision: NSUInteger (aka 'unsigned long') to ShapeType

更新swift编程:

在swift中,有一个语法变化。

enum ControlButtonID: NSUInteger {case kCircle , kRectangle, kOblateSpheroid}

#6楼

枚举用于为枚举元素赋值,这些元素无法在struct中完成。 因此,每次都可以通过我们分配给枚举中的变量的值来代替访问完整变量。 默认情况下,它以0赋值开始,但我们可以为其赋值任何值,枚举中的下一个变量将被赋值为前一个值+1。


#7楼

typedef允许程序员将一个Objective-C类型定义为另一个。 例如,

typedef int Counter; 将类型Counter定义为等效于int类型。 这极大地提高了代码的可读性。


#8楼

Typedef是C和C ++中的关键字。 它用于为基本数据类型(char,int,float,double,struct和enum)创建新名称。

typedef enum {kCircle,kRectangle,kOblateSpheroid
} ShapeType;

这里创建枚举数据类型ShapeType ,我们可以为枚举类型ShapeType编写新名称,如下所示

ShapeType shape1;
ShapeType shape2;
ShapeType shape3;

#9楼

您可以使用以下格式,Raw默认值从0开始,所以

  • kCircle是0,
  • kRectangle是1,
  • kOblateSpheroid是2。

您可以指定自己的特定起始值。

typedef enum : NSUInteger {kCircle, // for your value; kCircle = 5, ...kRectangle,kOblateSpheroid
} ShapeType;ShapeType circleShape = kCircle;
NSLog(@"%lu", (unsigned long) circleShape); // prints: 0

#10楼

枚举可以减少许多类型的“错误”并使代码更易于管理

#define STATE_GOOD 0
#define STATE_BAD 1
#define STATE_OTHER 2
int STATE = STATE_OTHER

该定义没有约束。 它只是一个替代品。 它无法限制州的所有条件。 当STATE被分配给5时,程序将是错误的,因为没有匹配状态。 但是编译器不会警告STATE = 5

所以最好这样使用

typedef enum SampleState {SampleStateGood  = 0,SampleStateBad,SampleStateOther
} SampleState;SampleState state = SampleStateGood;

#11楼

用户定义的类型,其值可能为kCirclekRectanglekOblateSpheroid 。 但是枚举中的值(kCircle等)在枚举之外是可见的。 记住这一点很重要(例如, int i = kCircle;有效)。


#12楼

这里声明了三件事:声明了一个匿名枚举类型, ShapeType被声明为该匿名枚举的typedef,并且三个名称kCirclekRectanglekOblateSpheroid被声明为整数常量。

让我们打破它。 在最简单的情况下,枚举可以声明为

enum tagname { ... };

这声明了带有标记tagname的枚举。 在C和Objective-C(但不是 C ++)中,对此的任何引用都必须enum关键字开头。 例如:

enum tagname x;  // declare x of type 'enum tagname'
tagname x;  // ERROR in C/Objective-C, OK in C++

为了避免在任何地方使用enum关键字,可以创建一个typedef:

enum tagname { ... };
typedef enum tagname tagname;  // declare 'tagname' as a typedef for 'enum tagname'

这可以简化为一行:

typedef enum tagname { ... } tagname;  // declare both 'enum tagname' and 'tagname'

最后,如果我们不需要能够将enum tagnameenum关键字一起使用,我们可以使enum匿名并仅使用typedef名称声明它:

typedef enum { ... } tagname;

现在,在这种情况下,我们将ShapeType声明为匿名枚举的typedef名称。 ShapeType实际上只是一个整数类型,并且只应用于声明包含声明中列出的值之一的变量(即kCirclekRectanglekOblateSpheroid )。 但是,您可以通过强制转换为ShapeType变量指定另一个值,因此在读取枚举值时必须小心。

最后, kCirclekRectanglekOblateSpheroid在全局命名空间中声明为整数常量。 由于未指定特定值,因此将它们分配kCircle 0开头的连续整数,因此kCircle为0, kRectangle为1, kOblateSpheroid为2。


#13楼

枚举声明了一组有序值 - typedef只是为此添加了一个方便的名称。 第一个元素是0等

typedef enum {
Monday=1,
...
} WORKDAYS;WORKDAYS today = Monday;

以上只是shapeType标签的枚举。

Objective-C中的typedef枚举是什么?相关推荐

  1. 浅谈C/C++中的typedef和#define

    typedef和#define的用法与区别 一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: ...

  2. 27.怎样在Swift中声明typedef?

    在OC中,我们经常会用typedef关键字来声明Block,例如: /*** 通用的空闭包类型,无参数,无返回值*/ typedef void (^GofVoidBlock)(void); 在Swif ...

  3. C/C++中的typedef 和 #define

    C/C++中的typedef 和 #define typedef C/C++中的关键字typedef允许用户为类型名来起一个新名字,通常会是缩写或者能够清晰表明类型含义的新名字. 例: typedef ...

  4. java实体类中有枚举类型_当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?...

    当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出? 问题: orderStatus 和 payStatus都是枚举类,并且枚举的个数达地10来个,我们不可能在模板页面(jsp/ftl ...

  5. js 对象中,可枚举性(enumerable)是什么?

    js 对象中,可枚举性(enumerable)是什么? 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在 for-in 循环之中(除非属性名是一个 Symbol).具体来说,如果一 ...

  6. 在 dart fluter 中使用 typedef

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1rfhOkXm-1626739923044)(https://ducafecat.tech/2021/07/20/tra ...

  7. C#语言中提供了枚举和整型之间的强制转换功能(SelectItem)

    [csharp] view plain copy   <span style="font-family: Arial, Helvetica, sans-serif;"> ...

  8. JS中的可枚举属性与不可枚举属性的学习以及扩展

    最近在学习对象遍历的方法时总是能看到的两个词,一个是"原型",一个是"枚举属性".一开始感觉自己大概明白"枚举属性"的意思,但是叫我解释却又 ...

  9. Reflect.ownKeys()与Object.keys()区别 以及 JS中的可枚举属性与不可枚举属性

    代码test1: var obj = {} Object.defineProperty(obj, 'method1', {value: function () {alert("Non enu ...

最新文章

  1. Slackware网卡配置文件和配置工具
  2. python中syntaxerror_【已解决】Python中两个星号**参数去传递给函数出错:SyntaxError invalid syntax...
  3. 云服务被归类为IDC业务 提供云服务必须持证上岗
  4. 学习vue-router源码记录-1
  5. MacBook安装Mysql
  6. Charles破解和安装【破解APP抓包限制】Xposed+JustTrustMe关闭SSL证书验证
  7. 硬盘分区时GPT和MBR的区别/选择
  8. ps新手零基础知识入门教程学习_图文
  9. 豪斯多夫(Hausdorff)距离
  10. 【C语言】案例十六:掷骰子(随机数)
  11. 100个python算法超详细讲解:将真分数分解为埃及分数
  12. 创建HTML电子邮件签名的Hotmail , Gmail以及雅虎邮箱
  13. git第一次提交不能使用git commit -a -m
  14. 风筝轮评测 风筝选购指南
  15. 高通平台 屏幕相关问题
  16. 利用python获取自己的qq群成员信息!
  17. python动态交互式图表库_干货 | 使用pyecharts绘制交互式动态地图
  18. Filter Solutions之滤波器设计
  19. linux kernel 培训,《Linux Kernel培训课件》.pdf
  20. Linux使用光盘镜像配置本地yum源(免于重复挂载)

热门文章

  1. JS删除数组中某一项或几项的方法汇总
  2. 非常漂亮滴皮肤skin++ 终极破解之法
  3. .NET 4.0中的泛型协变和反变
  4. 华为荣耀 4x 刷机体验 直奔 Android 6.0
  5. Spring 实现发送电子邮件的两种方法
  6. Repeater控件的嵌套使用
  7. Process Node.js 进程
  8. 截取字符串,计算字符串字节大小,选择文件夹,上传文件
  9. vmware workstation虚拟机安装Ubuntu server 18.04
  10. 为监控主机添加SNMPv3模板