如何在SwiftUI中将对象属性以字符串形式作为参数传递
SwiftUI 环境下通过字符串获取对象属性的实现方案
Swift 为强类型语言,默认不支持 JS 那种直接用对象[字符串键]的动态取值语法,但可以通过两种方案实现同等效果:
方案1:使用 Mirror 反射(支持所有类型,包括结构体、枚举、类)
这是最通用的实现方式,不需要依赖 NSObject 体系:
// 定义示例结构体 struct User { let foo: Int let username: String } // 通用取值方法 func getValue<T>(from object: Any, forKey key: String) -> T? { let mirror = Mirror(reflecting: object) return mirror.children.first { $0.label == key }?.value as? T } // 使用示例 let a = User(foo: 123, username: "test") let str = "foo" let value: Int? = getValue(from: a, forKey: str) // 输出结果:Optional(123)
方案2:使用 KVC 键值编码(仅支持继承自 NSObject 的类)
如果你的对象是继承自 NSObject 的类,可以直接用系统原生的 KVC 接口,写法更接近 JS 的用法:
// 定义示例类,必须继承自NSObject,属性加@objc修饰 class User: NSObject { @objc let foo: Int @objc let username: String init(foo: Int, username: String) { self.foo = foo self.username = username } } // 使用示例 let a = User(foo: 123, username: "test") let str = "foo" let value = a.value(forKey: str) as? Int // 输出结果:Optional(123)
注意事项
- 两种动态取值方式都会丢失编译时类型校验,只有运行时才能判断取值是否成功,非必要场景不推荐使用
- 使用 KVC 时如果属性未加
@objc修饰,运行时会直接崩溃
内容的提问来源于stack exchange,提问作者user15159145
相关产品推荐
相关产品推荐

