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,需要结合以下操作实现需求:
- 将变量包装进容器以捕获标签
把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
- 自定义反射包含计算属性(可选)
如果需要让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
相关产品推荐
相关产品推荐

