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

将特性映射到Swift中的另一个对象,swift,Swift,假设我有一个这样的结构 struct MyStruct: Codable { var bool1: Bool? = false var bool2: Bool var whateverElse: Date var andThis: String? } 现在struct有大约30个属性,我需要不时地添加更多属性 在应用程序逻辑的一部分中,我需要从同一结构的另一个实例中仅重置布尔属性,因此我有一个类似这样的无聊方法: func resetToValues(_ from: MyStr

假设我有一个这样的结构

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
}
请注意,
whateverels
以及此
不会重置。 每次我添加一个属性时,我都必须为这个方法添加一行,这很烦人

是否有某种方法可以使其自动化,从而只重置
Bool
Bool?
属性


我想得到
CodingKeys
并对它们进行迭代,但不幸的是,因为我无法从
Mirror.Child
中获得很多信息,也无法通过字符串获得
KeyPath
,我陷入了无法确定Bool和not的困境。

您可以使用魔法生成代码:

  • 安装源代码
  • 添加template.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 %}
    
  • 将新脚本添加到构建阶段:

    源代码--源代码--模板--输出

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


  • 您可以使用巫术生成代码:

  • 安装源代码
  • 添加template.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 %}
    
  • 将新脚本添加到构建阶段:

    源代码--源代码--模板--输出

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