项目里有个多账户登录功能,包括普通的用户名密码登录、匿名登录、facebook登录、google登录,为了区分用户类型就建了个枚举
1 2 3 4 5 6 7 8 9 10 |
typedef NS_ENUM(NSInteger, UserType) { //facebook账号 UserFB, //谷歌账号 UserGG, //一般账号 UserNormal, //匿名账号(游客登录) UserAnony, }; |
注意这里是没有设置枚举值的,默认是0、1、2、3
同时还有个用了类似代码的项目,只不过fb、gg换成了微博、微信登录
1 2 3 4 5 6 7 8 9 10 |
typedef NS_ENUM(NSInteger, UserType) { //微博账号 UserWB, //微信账号 UserWX, //一般账号 UserNormal, //匿名账号(游客登录) UserAnony, }; |
这两个项目用了相似的代码,我便决定合成一个项目,枚举的部分改成了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
typedef NS_ENUM(NSInteger, UserType) { //facebook账号 UserFB, //谷歌账号 UserGG, //一般账号 UserNormal, //匿名账号(游客登录) UserAnony, //微博账号 UserWB, //微信账号 UserWX, }; |
直接用起来看似没什么问题。但联系到数据库上就要出问题了,项目中要保存用户类型进数据库,枚举值在存进去时其实是int类型的数字。也就是用了上述第三个枚举后,使用wb、wx的那个项目,数据库里存着的0、1对应的不是wb、wx而是fb、gg了。
这个bug的副作用可小可大,小的导致图标错乱,大的可能导致无法登录、账号丢失。总之,枚举一定要赋值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
typedef NS_ENUM(NSInteger, UserType) { //facebook账号 UserFB = 0, //谷歌账号 UserGG = 1, //一般账号 UserNormal = 2, //匿名账号(游客登录) UserAnony = 3, //微博账号 UserWB = 4, //微信账号 UserWX = 5, }; |
如果当初设计的时候就考虑到这一点,给用户类型枚举赋不同的值,就不会有这种bug了。
现在的解决办法只能是那个使用wb、wx的项目,数据库加个更新操作,把fb(0)、gg(1)的账户类型更新成wb(4)、wx(5)