0

节日快乐!

我有一个属性包装器,用于定义键值对中的键。

@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 对并将它们放入集合中?

我非常感谢您能提供的任何帮助。

4

1 回答 1

0

感谢 Swift 社区,我得到了答案。 https://forums.swift.org/t/property-wrappers-with-generics-vs-mirroring/54325/4

于 2021-12-29T01:38:50.500 回答