有时我们一个枚举变量 可能会包含多个枚举元素, 比如枚举类型:
1 2 3 4 5 6 7 8 9 10 11 |
public enum Week { None, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } |
在这个星期的枚举类型中,我们定义一个表示工作日的变量 weekDay
1 |
Week weekDay; |
这时候我们如果想 给weekDay变量赋值多个枚举值 Monday Tuesday …… 是不可以的。
下面我们就要使用Flags来解决这样的问题,直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
using UnityEngine; using System.Collections; using System; [Flags] // Flags关键字允许我们在使用.net 枚举变量时,使用多个组合值 public enum Week { None = 0, // 在组合值中,0代表不存在 Monday = 1, Tuesday = 2, Wednesday = 4, Thursday = 8, Friday = 16, Saturday = 32, Sunday = 64 } public class FWeek { /// <summary> /// 添加枚举元素 /// </summary> /// <param name="w"> 原始变量 </param> /// <param name="_wArray"> 要增加的类型</param> public static void Add(ref Week w, Week[] _wArray) { foreach (Week _w in _wArray) { w = w | _w; } } /// <summary> /// 移除枚举元素 /// </summary> /// <param name="w"> 原始变量 </param> /// <param name="_wArray"> 要增加的类型</param> public static void Remove(ref Week w, Week[] _wArray) { foreach (Week _w in _wArray) { w = w & ~_w; } } /// <summary> /// 是否包含 /// </summary> /// <param name="w"> 原始变量 </param> /// <param name="_w"> 要增加的类型</param> public static bool IsContain(Week w, Week _w) { return 0 != (w & _w); } /// <summary> /// 是否为None /// </summary> public static bool IsNone(Week w) { return w != Week.None; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using UnityEngine; using System.Collections; using System; public class Test : MonoBehaviour { // Use this for initialization void Start () { Week weekDay = Week.None; FWeek.Add(ref weekDay, new Week[] { Week.Monday, Week.Tuesday, Week.Wednesday, Week.Thursday, Week.Friday, Week.Sunday }); Debug.Log("一周工作日都有星期几:" + weekDay); FWeek.Remove(ref weekDay, new Week[] { Week.Sunday }); Debug.Log("周日好像不是工作日:" + weekDay); bool hasMonday = FWeek.IsContain(weekDay, Week.Monday); Debug.Log("有没有周一: " + hasMonday); } } |
在这里 我给Week枚举变量的增删查 封装了类FWeek.ts,在Test.ts脚本中使用对应的方法就可以实现我们的组合值。
需要注意的是 枚举元素后面的值 要遵守一定规则,才能完成我们需要的按位与 或的运算
规则:仅能使用 下列该值:
1 2 3 4 5 6 7 8 9 10 |
二进制 对应 十进制 0000 0000 // 0 0000 0001 // 1 0000 0010 // 2 0000 0100 // 4 0000 1000 // 8 0001 0000 // 16 0010 0000 // 32 0100 0000 // 64 1000 0000 // 128 |
或运算:
1 2 3 4 5 |
0000 0001 --星期一 0x1 或 0100 0000 --星期六 0x20 或 0000 0010 --星期二 0x2 = 0100 0011 = 67 换句话说: 某个位是1就代表了这个位上的值在枚举中存在 |
将星期一从枚举变量中去掉
1 2 3 |
0100 0011 &1011 1111 (~WeekDays.Monday)取反 =0000 0011 这样就把星期一去掉啦! |
- 本文固定链接: http://www.u3d8.com/?p=784
- 转载请注明: 网虫虫 在 u3d8.com 发表过