如何在没有长堆if语句的情况下将float映射到枚举

wil*_*lc2 2 objective-c ios

给定一个浮点数,如何将它映射到枚举类似

{FAIL,POOR,OK,GOOD,EXCELLENT,PERFECT}

如果分歧不均匀.

0.0-0.4失败
0.4-0.6 很差
...
0.8-0.999 ..优秀
1.0是完美的

浮动是根据游戏中所有玩过的等级计算的等级值.它的范围从0..1,包括两者.通常不需要超过10个分区,但是在开发过程中间距会受到调整.

我目前正在使用一堆if..else语句.这是正确的方法吗?看起来有点脆弱.

CRD*_*CRD 5

使用一个结构数组 - 静态分配或动态 - 然后一个简单的例程来搜索它 - 如果它只是迭代,如果它的大,你可以进行二进制搜索.

如您所知,最小(0.0)和最大(1.0)您只需要存储范围的上限和枚举值.例如:

typedef enum {FAIL, POOR, OK, GOOD, EXCELLENT, PERFECT} Rating;

typedef struct
{
   float upperBound;
   Rating score;
} RatingDivision;

static RatingDivision Divisions[] =
{
   { 0.4, FAIL },
   { 0.6, POOR },
   ...
   { 0.999, EXCELLENT },
   { 1.0, PERFECT }
};
Run Code Online (Sandbox Code Playgroud)

现在sizeof(Divisions)/sizeof(RatingDivision)将告诉您条目的数量(二进制搜索所需),或者只是迭代直到您要查找的值<= Divisions[i].upperBound返回Divisions[i].score或者没有匹配的upperBound到达1.0并处理错误.