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

Swift中如何获取常量/变量的标签与值?含Mirror场景

如何通过Mirror获取变量自身的标签和计算属性值?

我正在用Mirror访问自定义结构体的子属性,相关代码如下:

struct TestType {
    var firstName: String
    var lastName: String
    
    var value: String {
        return firstName + lastName
    }
}

使用示例:

let person: TestType = TestType(firstName: "Tim", lastName: "Cook")

for property in Mirror(reflecting: person).children  {
    print("label: \(property.label!)", "value: \(property.value)")
}

执行结果:

label: firstName value: Tim
label: lastName value: Cook

现在我想对person常量执行类似操作,获取它的标签“person”以及对应的值(预期输出为“label: person value: Tim Cook”),请问Swift里怎么实现?


解决方案

直接反射person实例时,Mirror只会解析它的内部存储属性,无法获取变量自身的标签;同时默认Mirror不会包含计算属性value,需要结合以下操作实现需求:

  1. 将变量包装进容器以捕获标签
    把person放入元组或自定义结构体中,让Mirror能识别“person”这个标签:
// 用元组包装变量
let wrapper = (person: person)

for property in Mirror(reflecting: wrapper).children {
    guard let label = property.label else { continue }
    // 判断属性类型,取出TestType实例的计算属性value
    if let testInstance = property.value as? TestType {
        print("label: \(label) value: \(testInstance.value)")
    } else {
        print("label: \(label) value: \(property.value)")
    }
}

执行后输出:

label: person value: Tim Cook

  1. 自定义反射包含计算属性(可选)
    如果需要让Mirror自动解析TestType的计算属性,可以让结构体遵循CustomReflectable协议,手动指定反射内容:
extension TestType: CustomReflectable {
    var customMirror: Mirror {
        let children = [
            ("firstName", firstName),
            ("lastName", lastName),
            ("value", value)
        ]
        return Mirror(self, children: children, displayStyle: .struct)
    }
}

这样反射TestType实例时,就能同时拿到存储属性和计算属性,结合容器包装即可完整实现需求。


内容的提问来源于stack exchange,提问作者swiftPunk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 07:15:34