我已经阅读了许多教程,并尝试了无数种方法来使它起作用,但似乎找不到解决方法。
我要做的就是使用反射来设置命名成员变量的值。我可以读取值,但是如何写入值?
这是我的示例代码:
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。
任何帮助将不胜感激。谢谢!
答案 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
希望它对您有帮助。