节日快乐!
我有一个属性包装器,用于定义键值对中的键。
@propertyWrapper
final public class KeyValuePair<T> {
public var wrappedValue: T?
private(set) var key: String
public init(key: String) {
self.key = key
}
}
编辑: 并使用以下协议,所有 KV 模型都应遵守...
protocol Parametrized {
var toParameters: [String: Any] { get }
}
属性包装器以下列方式使用:
struct Person: Parametrized {
@KeyValuePair(key: "first_name") var firstName: String?
@KeyValuePair(key: "last_name") var lasteName: String?
@KeyValuePair(key: "age") var age: Int?
@KeyValuePair(key: "isSingle") var isSingle: Bool?
@KeyValuePair(key: "isOpenForDating") var isOpenForDating: Bool?
}
var missUniverse2022 = Person()
missUniverse2022.firstName = "Miss"
missUniverse2022.lastName = "Universe"
missUniverse2022.age = 23
missUniverse2022.isSingle = true // Rad <3
missUniverse2022.isOpenForDating = false // Sad :D
因此,整个想法是生成一个类型的字典,该字典[String: Any]
使用 Mirror 保存该结构中的键值对。问题是以下代码不起作用(我知道原因,但我不知道解决方法):
extension Parametrized {
var toParameters: [String: Any] {
var parameters = [String: Any]()
for child in Mirror(reflecting: self).children {
/***********************************************
Generic parameter 'T' could not be inferred in cast to 'KeyValuePair'
Explicitly specify the generic arguments to fix this issue
***********************************************/
guard let kvPair = child.value as? KeyValuePair else { continue }
parameters[kvPair.key] = kvPair.wrappedValue
}
return parameters
}
}
所以,我在这里求助专家:如何使用镜像逻辑来获取 kv 对并将它们放入集合中?
我非常感谢您能提供的任何帮助。