You need to enable JavaScript to run this app. 如何在SwiftUI中将对象属性以字符串形式作为参数传递
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 21:36:06