gpt4 book ai didi

objective-c - 获取 NS_ENUM 项目数量的优雅方式

转载 作者:太空狗 更新时间:2023-10-30 03:18:06 32 4
gpt4 key购买 nike

是否有一种优雅的方法来获取 NS_ENUM 中的项目总数?最大值呢?


一些例子:

typedef NS_ENUM(NSInteger, MyEnum)
{
MyEnumA = 0,
MyEnumB = 1,
MyEnumC = 2
};
// NumberOfItems(MyEnum) -> 3, MaximumValue(MyEnum) -> 2.


typedef NS_ENUM(NSInteger, MyEnum)
{
MyEnumA,
MyEnumB,
MyEnumC
};
// NumberOfItems(MyEnum) -> 3, MaximumValue(MyEnum) -> 2.


typedef NS_ENUM(NSInteger, MyEnum)
{
MyEnumA = 4,
MyEnumB,
MyEnumC
};
// NumberOfItems(MyEnum) -> 3, MaximumValue(MyEnum) -> 6.


typedef NS_ENUM(NSInteger, MyEnum)
{
MyEnumA = 0,
MyEnumB = 2,
MyEnumC = 4
};
// NumberOfItems(MyEnum) -> 3, MaximumValue(MyEnum) -> 4.

最佳答案

不幸的是,C 枚举(NS_ENUM 宏是其生成器)相当简单,没有反射。

如果您的枚举值是连续的,使用限制值获取项目数很简单:

typedef NS_ENUM(NSInteger, MyEnum) {
MyEnumA = 0,
MyEnumB,
MyEnumC,
MyEnumMax
};

NSUInteger numItems = MyNumMax;

但是,这不是一个理想的解决方案,因为当您编写一个 switch 时,如果您不添加一个 case MyEnumMax:(或 默认值:)。

您最好的选择是为每个枚举创建信息函数:

typedef NS_ENUM(NSInteger, MyEnum) {
MyEnumA = 0,
MyEnumB = 2,
MyEnumC = 4,
};

NSUInteger MyEnumSize() {
return 3;
}

您还可以使用一些高级宏技术,例如 X-macros动态生成这个函数。

重要警告:X-macros 并不简单,不易阅读,但功能强大。示例如下:

MyEnum.h

#define MY_ENUM_DEFINITIONS \
NS_ENUM_X_VALUE(MyEnumA, = 0) \
NS_ENUM_X_VALUE(MyEnumB,) \
NS_ENUM_X_VALUE(MyEnumC, = 4)

#define NS_ENUM_X_VALUE(__NAME__, __INT_VALUE__) __NAME__ __INT_VALUE__,

typedef NS_ENUM(NSInteger, MyEnum) {
MY_ENUM_DEFINITIONS
};

#undef NS_ENUM_X_VALUE

NSString * NSStringFromMyEnum(MyEnum value);
NSArray * MyEnumValues();
NSUInteger MyEnumSize();
NSUInteger MyEnumMin();
NSUInteger MyEnumMax();

MyEnum.m

#define NS_ENUM_X_VALUE(__NAME__, __INT_VALUE__) [__NAME__] = @#__NAME__,

static NSString* MyEnumStringTable[] = {
MY_ENUM_DEFINITIONS
};

#undef NS_ENUM_X_VALUE

NSString * NSStringFromMyEnum(MyEnum value) {
return MyEnumStringTable[value];
}

#define NS_ENUM_X_VALUE(__NAME__, __INT_VALUE__) @(__NAME__),

static NSOrderedSet * MyEnumValueSet() {
static NSOrderedSet *valueSet = nil;
static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{
valueSet = [[NSOrderedSet alloc] initWithObjects:
MY_ENUM_DEFINITIONS
nil];
});

return valueSet;
}

#undef NS_ENUM_X_VALUE


NSArray *MyEnumValues() {
return [MyEnumValueSet() array];
}

NSUInteger MyEnumSize() {
return MyEnumValueSet().count;
}

NSUInteger MyEnumMin() {
return [MyEnumValueSet().firstObject unsignedIntegerValue];
}

NSUInteger MyEnumMax() {
return [MyEnumValueSet().lastObject unsignedIntegerValue];
}

用法

NSLog(@"MyEnum size: %@", @(MyEnumSize()));
NSLog(@"MyEnum min: %@", @(MyEnumMin()));
NSLog(@"MyEnum max: %@", @(MyEnumMax()));

NSLog(@"MyEnumC value to string: %@", NSStringFromMyEnum(MyEnumC));

for (NSNumber *value in MyEnumValues()) {
NSLog(@"Value listing: %@ => %@", NSStringFromMyEnum([value unsignedIntegerValue]), value);
}

现在您可以修改/添加/删除 header 中的值,您的所有函数都将自动更新。

关于objective-c - 获取 NS_ENUM 项目数量的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24695580/

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