当前位置:  开发笔记 > IOS > 正文

Objective-C中的typedef枚举是什么?

如何解决《Objective-C中的typedef枚举是什么?》经验,为你挑选了8个好方法。

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

例如:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

这里真的被宣布了什么?



1> Adam Rosenfi..:

三件事正在这里声明:匿名枚举类型声明,ShapeType在声明该匿名枚举一个typedef和三个名字kCircle,kRectanglekOblateSpheroid被声明为整型常量.

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

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实际上只是一个整数类型,且只能用于声明持有在声明中列出的值中的一个变量(即,一kCircle,kRectanglekOblateSpheroid).但是,您可以ShapeType通过强制转换为变量赋值,因此在读取枚举值时必须小心.

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


Objective-C是C的正确超集.C中的所有C结构命名规则在Objective-C中都是有效的.
一旦你了解了这个答案,就值得一看新的NS_ENUM和NS_OPTIONS.这里的教程:http://nshipster.com/ns_enum-ns_options/和SO在这里:http://stackoverflow.com/questions/14080750/objective-c-enumeration-ns-enum-ns-options
如果您声明它们的文件是.mm文件而不是.m,则可以使用C++样式枚举.Objective-C++非常强大.
很好的解释 - 只是为了添加一件事,struct在C中遵循类似的命名规则(不确定Objective-C).

2> Vladimir Gri..:

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届"现代的Objective-C"的视频在这里.

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


关于"枚举改进"的部分从5:58开始
正如另一个答案所评论的那样,请看NSHipster对Apple的"NS_ENUM"宏的解释:http://www.NSHipster.com/ns_enum-ns_options/

3> 小智..:

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

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

WORKDAYS today = Monday;

以上只是shapeType标签的枚举.



4> Brian Mitche..:

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



5> Mani..:

更新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> 小智..:

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

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为前缀的漂亮宏.这应该可以帮助您轻松定义好的枚举,而且还有助于静态分析器在编译之前为您做一些有趣的检查.

好恩生!



7> Rajneesh071..:

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

typedef unsigned long int TWOWORDS;

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

TWOWORDS var1, var2;

代替

unsigned long int var1, var2;



8> Vivek Sehraw..:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;

然后你可以使用它像: -

 ShapeType shape;

 enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} 
ShapeType;

现在你可以使用它: -

enum ShapeType shape;

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有