2015-09-30 16 views
6

Ngay bây giờ tôi có thể kiểm tra các biến của một đối tượng sử dụng loại Mirror. Nhưng tôi có thể đặt giá trị cho các biến của mình bằng cách sử dụng tính năng phản chiếu không? Hoặc có thể có một cách tinh khiết-Swift khác? Ví dụ, tôi muốn tạo một đối tượng (một Swift struct) từ JSON. Có thể không có phân lớp NSObject và sử dụng các hàm Objective-C cho điều đó không?Tôi có thể đặt giá trị cho thuộc tính đối tượng Swift bằng cách phản chiếu không?

Trả lời

2

Đây là điều tốt nhất tôi có thể làm vào lúc này. Nó vẫn còn thiếu chuyển đổi mirrorObject trở lại kiểu generic của nó. FYI điều này đang sử dụng 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 Đó là cách để chuyển đổi thành phần loại đối tượng là phần khó. Trừ khi bạn muốn thực hiện tiện ích mở rộng tùy chỉnh cho mọi loại bạn từng tạo. Trong nhanh chóng 4 có Decodable và Encodable. Đây có thể làm điều này tự động. – eonist

0

Đây là câu hỏi cũ, nhưng câu trả lời không hiệu quả đối với tôi.

Tôi đã phải thay đổi đối tượng nhanh chóng của mình thành NSObject để làm cho mọi thứ hoạt động và cũng có các thuộc tính động.

Trong trường hợp của tôi, tôi sử dụng nhóm Soạn thảo để deserialize Dữ liệu.

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) 
      } 
     } 
    } 
Các vấn đề liên quan