Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 我可以使用镜像为Swift对象属性设置值吗?_Json_Swift_Swift2_Mirror_Mirroring - Fatal编程技术网

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

Json 我可以使用镜像为Swift对象属性设置值吗?,json,swift,swift2,mirror,mirroring,Json,Swift,Swift2,Mirror,Mirroring,现在我可以使用Mirrortype检查对象的变量。但是我可以使用镜像为变量设置值吗?或者也许还有另一种纯粹的快捷方式 例如,我想从JSON创建一个对象(Swiftstruct)。如果不将NSObject子类化并使用Objective-C函数,是否有可能做到这一点?这是目前我能做的最好的事情。仍然缺少将mirrorObject转换回其泛型类型。仅供参考,这是使用迅捷JSON func convertToObject<T>(json: JSON, genericObject: T) -&

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


例如,我想从JSON创建一个对象(Swift
struct
)。如果不将NSObject子类化并使用Objective-C函数,是否有可能做到这一点?

这是目前我能做的最好的事情。仍然缺少将mirrorObject转换回其泛型类型。仅供参考,这是使用迅捷JSON

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...
}
func convertToObject(json:json,generiobject:T)->T{
让mirroredObject=镜像(反射:genericObject)
对于mirroredObject.children.enumerate()中的(var,attr){
如果让propertyName=attr.label作为字符串{
attr.value=json[propertyName]
打印(propertyName)
打印(属性值)
}
}
//了解如何转换回对象类型。。。
}

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

我必须将我的swift对象更改为NSObject以使其正常工作,并具有动态属性

在我的例子中,我使用pod封送器来反序列化数据

 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)
          }
       }
  }

@Randex这是解决如何转换回对象类型部分的难题。除非你想为你创建的每一种类型做自定义扩展。在swift 4中,有可解码和可编码。这些可以动态执行此操作。这只是错误:类型为“Mirror.Children”(又名“AnyCollection”)的值没有成员“enumerate”,如果您使其枚举,则它可以工作,但设置attr.Value对对象属性值没有影响