2015-09-30 16 views
6

今はMirror型を使ってオブジェクトの変数を検査できます。ミラーリングを使用して変数に値を設定することはできますか?それとも別の素早い方法がありますか?ミラーリングを使用してSwiftオブジェクトのプロパティの値を設定できますか?

たとえば、JSONからオブジェクト(Swift struct)を作成したいとします。 NSObjectをサブクラス化せずにObjective-C関数を使用することは可能ですか?

答えて

2

これは私が現時点でできることでした。 mirrorObjectのジェネリック型への変換がまだ行なわれていません。 FYIこれは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... 
} 
+1

@Randex難しい部分であるオブジェクトタイプの部分に戻す方法は、図のとおりです。これまでに作成したすべてのタイプのカスタム拡張を作成しない限り。速い4ではDecodableとEncodableがあります。これらは動的にこれを行うことができます。 – eonist

0

を使用しているこれは、古い質問ですが、答えは私のために働いていませんでした。

私はスピーディなオブジェクトをNSObjectに変更して、機能させ、動的なプロパティを持たせなければなりませんでした。

私の場合、ポッドマーシャルを使用してデータを逆シリアル化します。

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) 
      } 
     } 
    } 
関連する問題