如何在Objective-C中定义和使用枚举(ENUM)?
如何在Objective-C中定义和使用枚举(ENUM)?
我在我的实现文件中声明了一个枚举,如下所示,并在我的接口中声明了一个该类型的变量PlayerState thePlayerState,并在我的方法中使用了这个变量。但是我得到了一个指出它未声明的错误。如何在我的方法中正确声明和使用一个类型为PlayerState的变量?\n在.m文件中:\n
@implementation View1Controller typedef enum playerStateTypes { PLAYER_OFF, PLAYER_PLAYING, PLAYER_PAUSED } PlayerState;
\n在.h文件中:\n
@interface View1Controller : UIViewController { PlayerState thePlayerState;
\n在.m文件的某个方法中:\n
-(void)doSomethin{ thePlayerState = PLAYER_OFF; }
在Objective-C中,我们可以使用ENUM来定义一组相关的常量。ENUM是一种枚举类型,它允许我们定义一组具有相同类型的常量,并且可以使用这些常量来表示不同的状态或选项。
在Objective-C中,我们可以在.h文件中使用以下语法定义ENUM:
typedef enum { PlayerStateOff, PlayerStatePlaying, PlayerStatePaused } PlayerState;
这个ENUM定义了一个名为PlayerState的枚举类型,它包含了三个常量:PlayerStateOff、PlayerStatePlaying和PlayerStatePaused。
在其他的SO问题中,你可以找到类似的答案。但是当我在复习ENUM时,我遇到了这个问题,所以我在这里也添加了答案。
通过使用ENUM,我们可以在代码中更清晰地表示和使用不同的状态或选项。例如,我们可以使用PlayerState枚举来表示播放器的状态:
PlayerState state = PlayerStatePlaying;
在这个例子中,我们将PlayerStatePlaying赋值给state变量,表示播放器正在播放状态。
通过使用ENUM,我们可以避免使用魔法数值或字符串来表示状态,从而使代码更加可读和可维护。
总结起来,通过定义和使用ENUM,我们可以更清晰地表示和使用一组相关的常量,从而使代码更具可读性和可维护性。
在Objective-C中如何定义和使用ENUM?
问题的原因是,typedef
需要放在头文件中,否则编译器无法确定PlayerState
的大小。除此之外,代码看起来没问题。
解决方法是将typedef
放在头文件中,或者其他被头文件#import
的文件中。这样做可以使得在两个不同的ViewControllers中使用同一个enum。如果在delegate/datasource的头文件中导入enum的头文件会导致错误,看起来似乎有些繁琐。所以可以创建一个新的.h文件来声明enum,并在两个ViewControllers的头文件中导入该文件。
最佳实践是使用NS_ENUM
宏来声明enum。
如果想要在Swift代码中使用enum,必须使用NS_ENUM
来声明enum。
是否仍然适用于2015年?我在.m文件中声明了typedef
,编译和运行都没有问题。
如果需要在其他文件中使用enum,则需要将其放在.h文件中。如果只在一个文件中使用,则将其放在.m文件中也是可以的。
理解了。
在Objective-C中定义和使用ENUM的方法是什么?
在Objective-C中,可以使用宏`NS_ENUM`来定义ENUM,以提高代码的兼容性,包括Swift。使用该宏的示例代码如下:
typedef NS_ENUM(NSInteger, PlayerStateType) { PlayerStateOff, PlayerStatePlaying, PlayerStatePaused };
这种方法更加现代化,并且在Objective-C中,如果想要在Swift代码中使用ENUM,则必须使用这种方法。
Apple官方文档中有相关说明,可以在此查看:[Swift and CAPI's](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html)
另外,有人提出了一个问题,即在Objective-C中是否可以像Java一样在ENUM中使用成员变量。对此,可以采用第二种解决方案,即使用`NS_ENUM`宏。
实际上,Apple官方文档中指出,当ENUM导入到Swift代码中时,C枚举的名称前缀会被移除。所有的Apple头文件都遵循这种形式。
使用`NS_ENUM`宏是更好的解决方案,它更加现代化,并且在Objective-C中使用ENUM时,如果想要在Swift代码中使用,是必须使用该方法的。