gpt4 book ai didi

objective-c - 在Objective C中声明枚举的不同方式

转载 作者:太空狗 更新时间:2023-10-30 03:47:44 25 4
gpt4 key购买 nike

为什么在 objective-c 中有这么多不同的方法来声明枚举?这很令人困惑。

以下有什么区别还是都一样?

enum WeekDays{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday
};

typedef enum : NSUInteger {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday
} WeekDays;

typedef NS_ENUM(NSInteger, WeekDays){
Monday,
Tuesday,
Wednesday,
Thursday,
Friday
};

enum {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday
};
typedef NSInteger WeekDays;

最佳答案

Is there any difference between the following or are they all the same?



有一些差异,一些是由于 C - 它是 Objective-C 的基础 - 如果你正在考虑将你的 Objective-C 代码导入到 Swift 中。

你的第一个例子:
enum WeekDays { Monday, ..., Friday };

是一个原始的 C enum .这声明了一个类型 enum WeekDays ,底层类型为 int , 和 5 个文字值。

现在 C 不是强类型语言:这里的文字值没有类型 enum WeekDays而是类型 int ;和 enum WeekDays 类型的变量可以分配除 Monday 以外的值直通 Friday ,并分配给 int没有强制转换或转换的变量。第一个文字值(此处为 Monday)将具有 int值(value) 0 ,后面的值将比前面的文字大一(所以这里 Friday 的值是 4 )。例子:
enum WeekDays one;
int two;

one = Monday;
two = Tuesday; // assigning enum literal to int is OK
two *= 42; // will produce an int value outside of Monday thru Friday
one = two; // which can be assigned to an enum WeekDays
one = 34; // int values can also be directly assigned

所有 enum这种方式的变化很弱。然而,许多编译器,包括至少从 v8 起就被 Xcode 使用的编译器,在某些情况下会发出警告(而不是错误),例如如果 switch表达式是 enum类型和 case标签要么省略一些声明的文字,要么具有声明值之外的值。

给文字显式值

可以将特定值提供给 enum,而不是依赖于默认值。文字。例如给 Monday1Friday具有值 5 :
enum WeekDays { Monday = 1, ..., Friday };

像往常一样,没有显式值的文字比前面的文字多分配一个。这些值也不需要连续:
enum WeekDays { Monday = 1, Tuesday = 42, Wednesday = 3, Thursday, Friday };

使用 typedef

许多 C 类型声明很复杂且难以解析(它们是 Material 问题),C typedef允许声明特定类型的别名。一个 typedef经常与 enum 一起使用避免必须使用的声明 enum使用类型时。例如:
typedef enum WeekDays { Monday, ..., Friday } WeekDays;

声明别名 WeekDays意思是 enum WeekDays .例如:
WeekDays one;      // means exactly the same as the previous
// declaration for one
enum WeekDays one; // also valid and means the same thing

眼见 WeekDays上面声明中的两次可能会令人困惑,或者对某些人来说只是打字太多,可以省略:
typedef enum { Monday, ..., Friday } WeekDays;

这与之前的声明略有不同, WeekDays现在是匿名 enum 的别名.对于这种类型,第一种声明形式现在无效:
enum Weekdays one; // invalid, no such enum
WeekDays one; // valid

更改底层类型

默认情况下 enum 的底层类型是 int .可以指定不同的整数类型,该类型必须足够大以容纳文字表示的所有值。整数类型是整数、无符号整数和字符类型。通过添加 : <type> 指定底层类型后 enum标签,并且文字可以被赋予相同类型的特定值。例如:
typedef enum Vowels : char { Letter_A = 'a', ..., Letter_U = 'u' } Vowels;

如上所述,可以使用匿名枚举:
typedef enum : char { Letter_A = 'a', ..., Letter_U = 'u' } Vowels;

使用 NS_ENUM
NS_ENUM是一个(Apple)Objective-C 便利宏,它扩展为 typedef和一个 enum宣言。例如:
typedef NS_ENUM(NSInteger, WeekDays) { Monday, ..., Friday };

扩展为:
typedef enum WeekDays : NSInteger WeekDays;
enum WeekDays : NSInteger { Monday, ..., Friday };

避免前向声明相当于:
typedef enum WeekDays : NSInteger { Monday, ..., Friday } WeekDays;

使用 Xcode v8,至少,使用 NS_ENUM 之间的编译器检查和警告没有区别。以上直接 typedef .

NS_ENUM有所作为

如果您正在编写 Swift 将使用的 Objective-C,则使用 NS_ENUM确实有所作为:使用 NS_ENUM 声明的枚举将作为 Swift 导入 enum ;而直接声明的将作为 Swift 导入 struct以及一组全局只读计算属性,每个文字一个。

当前的 Apple 文档(Using Swift with Cocoa and Objective-C (Swift 4.0.3),可通过 iBooks 获得)中没有解释为什么存在这种差异

最后,回到你的例子

以上应该使您能够找出差异:
  • 默认 C enum , 底层类型为 int , 类型用作 enum WeekDays
  • 别名 C enum , 底层类型为 NSUinteger , 类型用作 WeekDays
  • NS_ENUM生成 enum , 底层类型为 NSInteger , 类型可以被称为 WeekDaysenum WeekDays
  • 这声明了两种不同的类型,并且可能会产生警告。第一个是匿名enum没有别名,所以以后不能用这种类型引入变量。它引入的文字类型是 int .第二个是 NSInteger 的别名.在 64 位系统上 NSInteger是 64 位,而 int是 32 位,因此文字类型 ( int ) 和“枚举”类型 ( WeekDays ) 之间的赋值可能会产生警告。进一步 switch语句不会像前三个版本一样检查,因为它们只是基于 NSInteger .此版本似乎是对模拟 NS_ENUM 的错误尝试并且不应该使用(它本身是无效的,只是不按照它的建议行事)。

  • 希望所有照亮的东西都比它混淆的要多!

    关于objective-c - 在Objective C中声明枚举的不同方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48986767/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com