You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:09:39