【问题标题】:Property Wrappers vs Mirroring属性包装器与镜像
【发布时间】: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


【解决方案1】:

【讨论】:

  • 尽量不要包含仅链接的答案。在此处复制修复问题的相关代码,以防将来链接断开或用户删除他们的帖子。也使这里的用户更容易更快地找到答案。
猜你喜欢
  • 1970-01-01
  • 2015-12-05
  • 2016-01-03
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多