如何通过代码获取枚举中case语句的数量(不依赖关联值)
当然有可行方案啦!再也不用手动维护那个容易写错的static count变量了,给你两种实用的实现方式,都是完全不依赖关联值的:
方案一:利用
CaseIterable协议(首推) 从Swift 4.2开始,官方提供了CaseIterable协议,只要让你的枚举遵守它,就能自动获取所有case的集合,直接通过count拿到数量,完全不用手动维护:
enum Stuff: Int, CaseIterable { case first = 0 case second = 1 case third = 2 case forth = 3 } // 直接用下面的方式获取数量,新增/删除case都会自动更新 print(Stuff.allCases.count) // 输出4
这个协议会自动为枚举生成allCases静态属性,它是包含所有case的数组,取count就是你要的case总数。以后不管你新增case还是删掉某个case,这个数值都会自动同步,再也不会出现手动改count漏改的情况。
方案二:利用Mirror反射(兼容旧版本Swift)
如果你的项目还在用Swift 4.2之前的版本,或者有特殊情况没法用CaseIterable,可以通过反射来实现自动计数:
enum Stuff: Int { case first = 0 case second = 1 case third = 2 case forth = 3 static var count: Int { // 通过Mirror获取枚举的元数据,children就是所有case的集合 return Mirror(reflecting: self).children.count } } // 使用示例 print(Stuff.count) // 输出4
这里利用Mirror来获取枚举的类型元信息,它的children属性包含了所有定义的case,取这个集合的count就能得到case数量。不过这种方法的性能比CaseIterable略差一点,所以优先推荐第一种方案。
补充说明
这两种方法都完全不依赖枚举的关联值,哪怕你的枚举后续加入了带关联值的case(当然你的例子里是Int原始值枚举,没有关联值),也能正确统计case的总数。
内容的提问来源于stack exchange,提问作者Rob Bonner
相关产品推荐
相关产品推荐

