如何通过Mirror更改变量的值?

时间:2018-06-25 06:27:08

标签: swift reflection

有一类内部有字段的类,我想通过Swift Reflection命名为 Mirror 来获取所有字段并更改为新值, 我可以得到所有类别为 name value

的孩子
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"
}

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

  

无法分配给属性:“ item”是一个“ let”常量

是否可以通过 Mirror 是Swift来更改值?

Java通过 Reflection

可以胜任这项工作

更新

我在循环中使用var,可以更改值,但值的字段在类中未更改。

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

2 个答案:

答案 0 :(得分:1)

我找到了解决方案。我认为这对您有帮助

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
}

答案 1 :(得分:0)

这似乎是一个解决方案,尽管我尚未使用它:Swift Runtime Library