我可以使用镜像设置Swift对象属性的值吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以使用镜像设置Swift对象属性的值吗?相关的知识,希望对你有一定的参考价值。

现在我可以使用Mirror类型检查对象的变量。但是我可以使用镜像为变量设置值吗?或许还有另一种纯粹的Swift方式?

例如,我想从JSON创建一个对象(Swift struct)。没有子类化NSObject并使用Objective-C函数可以吗?

答案

这是我现在能做的最好的事情。它仍然缺少将mirrorObject转换回其泛型类型。仅供参考,这是使用SwiftyJSON

func convertToObject<T>(json: JSON, genericObject: T) -> T {
    let mirroredObject = Mirror(reflecting: genericObject)

    for (_, var attr) in mirroredObject.children.enumerate() {
        if let propertyName = attr.label as String! {
            attr.value = json[propertyName]
            print(propertyName)
            print(attr.value)
        }
    }
    // Figure out how to convert back to object type...
}
另一答案

这是一个老问题,但答案对我不起作用。

我不得不将我的swift对象更改为NSObject以使其工作,并且还具有动态属性。

在我的例子中,我使用pod Marshal来反序列化数据。

 class MyClass: NSObject, Unmarshaling
  {
       // @objc dynamic make property available for NSObject
       @objc dynamic var myProperty: String?

       required init(object: MarshaledObject) throws {
          super.init()

          initUsingReflection(object: object)
        }

        func initUsingReflection(object: MarshaledObject) {
          let mirror = Mirror(reflecting: self)

          // we go through children
          for child in mirror.children {
            guard let key = child.label else {
              continue
            }

            // This line is here to get the value from json, in my case I already know the type I needed
            let myValue: String = try! object.value(for: key)

            // The trick is here, setValue only exist in NSObject and not in swift object.
            self.setValue(myValue, forKey: key)
          }
       }
  }

以上是关于我可以使用镜像设置Swift对象属性的值吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用决策树来比较属性对的值吗?

我可以使用列表作为自定义模板属性的值吗?

我可以从后面的 C# 代码更新 WPF 绑定的值吗?

selectt标签设置 disable属性之后 还能获得里面的值吗

我可以通过XSLT强制使用XML属性,具体取决于另一个属性的值吗?

c:when判断语句中可以写js或者JAVA的代码获取的值吗?