使用反射在Swift中更改属性

7

我正在尝试创建一个序列化器,它将更改对象的属性。

例如:

class testobj{
    var prop1:Int = 3
    var prop2:String = "Hello"
    var prop3:Dictionary<String,String> = Dictionary<String,String>()
}

我知道我可以使用以下方式访问属性的名称和类型:
reflect(testobjc())[0].1

并且

var tester = testobj()
_std_lib_DemangledTypeName(tester.prop1)

但是我想要做的是类似这样的事情。
var tester = testobj()
for(var x:Int = 0; x < reflect(testobj()).count; x++){
    if(_std_lib_DemangledTypeName(tester.(reflect(testobj())[0].1)) == "Swift.String"){
        tester.(reflect(testobj())[0].1) = "World!"
    }
}

基本上,我想循环遍历给定类别所列出的所有属性,并在新创建的该类别对象上设置这些属性。任何指导都将不胜感激。Swift反射对我来说是新的。


Swift的反射函数似乎只允许读取属性(至少在beta 7中是这样)。结合一个setter方法,这篇文章:https://dev59.com/dmAf5IYBdhLWcg3w0VYf 可能会给你提供所需的内容。 - Eran Globen
@EranGloben 很好的想法。那样做是可行的,但我需要保证每个属性都有一个setter方法,由于我看不到在Swift中反射方法的任何方式,我无法保证自己......对此有什么想法吗?我感觉我可能只是运气不好。 - steventnorris
你在这里找到解决方案了吗? - Konstantin Heinrich
@KonstantinHeinrich 我没有试过。看起来没有简单的方法可以做到这一点。我找到了一些非常复杂的C语言工作,有人尝试用混合的结果将其塞入Swift中,但我并不确定这是最好的路线。然而,这可能是唯一的路线。 - steventnorris
@steventnorris 好的,我已经研究了一些网站,但也没有找到有用的东西。Swift是否有像C#中的“Type”或“PropertyInfo”这样的类?不能设置新属性值真的很烦人 :-( - Konstantin Heinrich
@KonstantinHeinrich 我没有找到可靠的方法。Swift 的反射能力似乎严重不足。虽然似乎有一些开端,但我自己还没有尝试过。 https://dev59.com/JGAg5IYBdhLWcg3wBXAR - steventnorris
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接