代码之家  ›  专栏  ›  技术社区  ›  zaitsman

将属性映射到Swift中的另一个对象

  •  0
  • zaitsman  · 技术社区  · 6 年前

    假设我有一个这样的结构

    struct MyStruct: Codable {
      var bool1: Bool? = false
      var bool2: Bool
      var whateverElse: Date
      var andThis: String?
    }
    

    现在struct有大约30个属性,我需要不时地添加更多的属性。

    作为应用程序逻辑的一部分,我需要重置 只有布尔值 属性来自同一个结构的另一个实例,所以我有一个无聊的方法,如下所示:

    func resetToValues(_ from: MyStruct) {
      self.bool1 = from.bool1
      self.bool2 = from.bool2
    }
    

    请注意 whateverElse 和 andThis 未复位。 每次我添加一个属性,我必须添加一行到这个方法,这是恼人的。

    有没有办法让它自动化 Bool 和 Bool? 属性是否重置?

    我想到了 CodingKeys 重复它们,但不幸的是,因为我不能从 Mirror.Child 也不能得到 KeyPath 我陷入了一个无法确定什么是布尔,什么不是布尔的困境。

    0 回复  |  直到 6 年前
        1
  •  2
  •   nghiahoang    6 年前

    您可以使用巫术生成代码: https://github.com/krzysztofzablocki/Sourcery

    1. 安装Sourcery
    2. 添加模板.stencil文件:

    您的模板文件可以是:

    import Foundation
    
    {% for type in types %}
    extension {{type.name}} {
        mutating func reset(with other: {{type.name}}) {
            {% for variable in type.storedVariables %}
            {% if variable.typeName|hasPrefix:"Bool" %}
            self.{{variable}} = other.{{variable}}
            {% endif %}
            {% endfor %}
        }
    }
    {% endfor %}
    
    1. 将新脚本添加到构建阶段:

      sourcery—源代码<你的路径.struct>--模板<指向模具的路径(>);--输出<路径到输出(>);

    2. 生成输出文件并将其添加到项目中(仅第一次)