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?
6
A
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...
}
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
- 1. Cách tự động đặt giá trị của thuộc tính của đối tượng bằng cách sử dụng phản chiếu?
- 2. C# Đặt đối tượng Giá trị thuộc tính DateTime thông qua sự phản chiếu
- 3. Cách đặt giá trị thuộc tính thông qua tên thẻ thuộc tính bằng cách sử dụng sự phản chiếu?
- 4. Đặt thuộc tính Nullable <> bằng cách phản chiếu
- 5. Đặt thuộc tính bằng cách phản ánh với giá trị chuỗi
- 6. Tôi có thể đặt giá trị thuộc tính với Reflection không?
- 7. Thuộc tính đối tượng JavaScript có thể tham chiếu đến thuộc tính khác của cùng một đối tượng không?
- 8. Tìm đối tượng javascript cho thuộc tính có giá trị cụ thể?
- 9. Tôi có thể đặt một trích dẫn trong thuộc tính JQuery bằng bộ chọn ([thuộc tính = giá trị]) không?
- 10. Có cách nào để đặt thuộc tính tĩnh riêng tư/được bảo vệ bằng các lớp phản chiếu không?
- 11. tại sao tôi không thể tải thuộc tính AssemblyVersion bằng cách sử dụng phản chiếu?
- 12. Có thể đặt các điểm trên thuộc tính Swift không?
- 13. Tôi có thể yêu cầu CLR đối chiếu các đối tượng bất biến giữa AppDomains bằng cách tham chiếu không?
- 14. jQuery: Cách tìm đối tượng có thuộc tính nhất định bằng một giá trị nhất định?
- 15. Sử dụng Phản chiếu để đặt giá trị biến tĩnh trước khi khởi tạo đối tượng?
- 16. Cách đặt giá trị thuộc tính bằng Biểu thức?
- 17. C# - Giá trị thuộc tính đệ quy/phản ánh
- 18. Cách đặt thuộc tính giá trị HTML (có dấu cách)
- 19. Tôi có thể đặt thuộc tính `thuộc tính` của` UILabel`
- 20. Làm thế nào tôi có thể gán một thuộc tính cho một đối tượng jQuery?
- 21. Tôi có thể đặt nhiều giá trị của cùng một thuộc tính CSS với Javascript không?
- 22. Hibernate: không thể đặt giá trị trường bằng bộ phản chiếu của com.mahlzeit.datamodel.address.City.id
- 23. Cách lấy giá trị của thuộc tính của đối tượng theo tên thuộc tính trong PowerShell?
- 24. Mô-đun có thể có các thuộc tính giống như cách đối tượng có thể không?
- 25. Tôi có thể chọn nhiều hơn một giá trị cho một thuộc tính trong XAML không?
- 26. Cách chỉ định giá trị của thuộc tính cho giá trị VAR nếu đối tượng không rỗng
- 27. Đặt tên thuộc tính, làm cách nào tôi có thể tạo đại biểu để nhận giá trị
- 28. Có thể đặt thuộc tính riêng tư thông qua phản chiếu không?
- 29. Nhận phản ánh giá trị của thuộc tính có getter có giá trị tùy chọn
- 30. Cài đặt functools cho tôi đối tượng AttributeError 'module' không có thuộc tính 'compose'
@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