0

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

我正在尝试向我的所有枚举添加一个扩展,该扩展具有一个返回枚举的随机案例的方法。所以,就我而言,我需要一种访问随机数组元素的方法。

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

这是我要实现的目标的示例:

{% 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 %}

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

有人对此有任何想法吗?

4

2 回答 2

1

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

{% 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()方法为每个关联值创建一个随机元素。

于 2020-06-22T16:38:59.920 回答
0

但是,如果您需要使用 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是一个实际数字。问题在于,在当前状态下,它实际上是在尝试访问一个名为“index”的属性。

于 2020-06-22T09:44:28.203 回答