swift - 如何通过镜像更改变量的值?

标签 swift reflection

有一个里面有字段的类,我想通过 Swift Reflection 命名为 Mirror 获取所有字段并用新值更改, 我可以获得类 namevalue

的所有 child
let m = Mirror(reflecting: self)
   for item in m.children {
       print("\(item.name) \(item.value)")
}

但不是改变变量的值:

let m = Mirror(reflecting: self)
   for item in m.children {
       item.value = "new Value"
}

并给出一个错误,因为字段是不可变的:

Cannot assign to property: 'item' is a 'let' constant

有没有办法通过 Mirror 改变值是 Swift 吗?

虽然 Java 有能力通过反射

完成这项工作

更新

我在循环中使用 var 并且可以更改值但值字段在类中没有更改。

let m = Mirror(reflecting: self)
   for var item in m.children {
    item.value = "new Value"
}

最佳答案

我找到了一个解决方案。我觉得对你有帮助

func toJSON() throws -> Any? {
    let mirror = Mirror(reflecting: self)

    guard !mirror.children.isEmpty else { return self }

    var result: [String: Any] = [:]

    for child in mirror.children {
        if let value = child.value as? JSONSerializable {
            if let key = child.label {
                result[key] = try value.toJSON()
            } else {
                throw CouldNotSerializeError.undefinedKey(source: self, type: String(describing: type(of: child.value)))
            }
        } else {
            throw CouldNotSerializeError.noImplementation(source: self, type: String(describing: type(of: child.value)))
        }
    }

    return result
}

关于swift - 如何通过镜像更改变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51017443/

相关文章:

ios - Swift:需要将使用按钮存储的数据移动到另一个 View Controller

swift - UIPageViewControllerDelegate : 'NSInternalInconsistencyException' , 原因: 'Invalid parameter not satisfying: [views count] == 3'

ios - 如何检查 View Controller 是否以模态方式呈现或推送到导航堆栈上?

java - 在 Java 中按名称设置变量

actionscript-3 - 如何列出特定包中的(可能大量)类? (AS3)

swift - 将 SQLClient 导入现有的 Xcode (Swift) 项目

swift - 在自动调整大小的 Collection View 中插入行 - 故障

c# - GetCustomAttributes 性能问题(表达式树是解决方案??)

java - 我可以使用 isAssignableFrom 来检查 Java 中 C1 是 C2 的子类型吗?

java - 从java文件生成JSON