使用 Sourcery 和 Stencil 访问随机数组元素

Access random array element using Sourcery and Stencil

我正在使用 Sourcery 和 Stencil 做一些代码生成工作。

我正在尝试向我的所有枚举添加一个扩展,该扩展具有 returns 枚举的随机大小写的方法。因此,就我而言,我需要一种访问随机数组元素的方法。

我知道我们可以使用以下方法之一进行数组查找:(首先、最后或按索引),但我找不到访问随机元素的方法。

这是我正在努力实现的一个例子:

{% for type in types.enums %}
extension {{ type.name }} {
    static func random() -> {{ type.name }} {
         let index = Int.random(in: 0..<{{ type.cases.count }})
         return .{{ type.cases.index.name }}
    }
}
{% endfor %}

前面的代码片段显然不起作用。我添加它只是为了表达我的意图。

有人对此有想法吗?

如果您需要使用 sourcery:

{% for type in types.enums %}
extension {{ type.name }} {
    static func random() -> {{ type.name }} {
        [{% for case in type.cases %}.{{ case.name }},{% endfor %}].randomElement()!
    }
}
{% endfor %}

您提供的示例的问题在于您希望 index 是一个实际数字。问题在于,在当前状态下,它实际上正在尝试访问一个名为“索引”的 属性。

所以,在其他人在这里发表的想法之后(感谢他们)。我像下面这样实现它,因为我还需要随机化具有关联值的案例的关联值:

{% for type in types.enums %}
extension {{ type.name }} {
    static func random() -> {{ type.name }} {
        let cases: [{{ type.name }}] = [
        {% for case in type.cases %}
        {% if case.associatedValues.count > 0 %}
        {% map case.associatedValues into values using value %}.random(){% endmap %}
            .{{ case.name }}({{ values|join:", " }}),
        {% else %}
            .{{ case.name }},
        {% endif %}
        {% endfor %}
        ]
        return cases.randomElement()!
    }
}
{% endfor %}

上面的代码片段遍历枚举的案例并创建一个包含所有案例的数组。如果案例具有关联值,它将使用 random() 方法为每个关联值创建一个随机元素。