【发布时间】:2021-12-28 21:56:12
【问题描述】:
节日快乐!
我有一个属性包装器,用于定义键值对中的键。
@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
}
}
所以,我在这里求助专家:如何使用镜像逻辑来获取 k-v 对并将它们放入集合中?
非常感谢您提供的任何帮助。
【问题讨论】:
-
因为这是在网络层中使用的。并且发送到后端的一些参数是蛇形格式,一些是大写的。此外,还有很多像示例一样的参数模型。最后,这对我们从 Android 转向 iOS 的开发者来说很方便。
-
哦,我错过了一个重要的部分:镜像由处理所有模型镜像的协议处理。我会编辑我的问题。对不起
标签: swift generics property-wrapper