使用 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()
方法为每个关联值创建一个随机元素。
我正在使用 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()
方法为每个关联值创建一个随机元素。