如何在Swift中使用反射设置成员变量值?

时间:2019-02-25 10:07:33

标签: ios swift reflection

我已经阅读了许多教程,并尝试了无数种方法来使它起作用,但似乎找不到解决方法。

我要做的就是使用反射来设置命名成员变量的值。我可以读取值,但是如何写入值?

这是我的示例代码:

class MyObject
{
    public var myString : String = "Not working"
}

func test()
{
    let value = "It works!"
    let member = "myString"
    var myObject = MyObject()

    let mirror = Mirror(reflecting: myObject)
    for (_, var attr) in mirror.children.enumerated() {
        if attr.label == member {
            print("Setting value of \(member)")

            // attempt to set the member variable value
            attr.value = value

            break
        }
    }

    print("New value: \(myObject.myString)")
}

运行此示例,输出将输出myString的旧值。我正在使用iOS的Swift 4。

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

  

Swift的反射功能基于名为struct的{   Mirror。您为特定的subject创建了一个镜像,并且   然后镜子将让您查询。

对于Mirror,您无法在subject的情况下修改MyObject

阅读HERE了解更多信息。

编辑:

您可以如下所示简单地更新类属性:

func test() {

    let myObject = MyObject()
    myObject.myString = "It works!"
    print("New value: \(myObject.myString)") // "New value: It works!"
}

答案 1 :(得分:0)

  

不幸的是,您无法使用Mirror修改此值的基本用法。

如果您可以接受,可以不加反省:

class MyObject: NSObject
{
    @objc public var myString : String = "Not working"
}

func test()
{
    let value = "It works!"
    let member = "myString"
    let myObject = MyObject()

    myObject.setValue(value, forKey: member)

    print("New value: \(myObject.myString)")
}

OR

看看这个:Reflection

希望它对您有帮助。