Swift如何自动获取枚举中所有静态属性并转为数组?
无法修改的枚举静态常量转键值数组解决方案
假设自动生成的枚举结构如下(仅作示例):
// 自动生成,不可修改的枚举 enum Items { static let sword = Assets(name: "Sword") static let shield = Assets(name: "Shield") static let potion = Assets(name: "Potion") } // 关联的Assets结构体 struct Assets { let name: String }
使用Mirror反射实现转键值数组
通过Mirror遍历枚举的静态属性,筛选出Assets类型的成员,组装成带字符串键的数组:
func fetchItemsAssets() -> [(key: String, value: Assets)] { let enumMirror = Mirror(reflecting: Items.self) var assetsList = [(key: String, value: Assets)]() for child in enumMirror.children { // 过滤出带属性名(键)且类型为Assets的成员 guard let propertyName = child.label, let asset = child.value as? Assets else { continue } assetsList.append((key: propertyName, value: asset)) } return assetsList } // 遍历使用示例 let allItems = fetchItemsAssets() for item in allItems { print("属性名:\(item.key),资源名称:\(item.value.name)") }
可选:转为字典格式
如果需要字典结构而非数组,可调整代码:
func fetchItemsAssetsDict() -> [String: Assets] { let enumMirror = Mirror(reflecting: Items.self) var assetsDict = [String: Assets]() for child in enumMirror.children { guard let propertyName = child.label, let asset = child.value as? Assets else { continue } assetsDict[propertyName] = asset } return assetsDict }
注意事项
Mirror仅遍历当前层级的静态属性,不会递归处理嵌套属性- 自动生成的枚举中若存在非
Assets类型的静态常量,会被自动过滤 - 该方案基于Swift标准库API,无额外依赖,完全适配不可修改的自动生成枚举
内容的提问来源于stack exchange,提问作者michals92
相关产品推荐
相关产品推荐

