我创建了具有关联值的枚举,并且希望能够动态更新关联值。据我所知,Swift目前不支持该功能。 因此,我使用了以下方法:
enum PersonInfo {
class EnumValue<T> {
var value: T
init(_ value: T) {
self.value = value
}
}
// Instead of using String or Bool or any other type directly, use EnumValue wrapper
case firstName(EnumValue<String>)
case lastName(EnumValue<String>)
case isAdult(EnumValue<Bool>)
}
我想添加将通过以下方式更新EnumValue.value
属性的函数:
func updateAssociatedValue<V>(_ updateValue: V) {
let mirror = Mirror(reflecting: self)
for associatedValue in mirror.children {
guard let value = associatedValue.value as? EnumValue<V> else {
continue
}
value.value = updateValue
}
}
问题在于此保护语句始终失败(guard let value = associatedValue.value as? EnumValue<V>
),我不知道为什么。
另一方面,当我用类型输入updateAssociatedValue
时,一切正常:
// This works
func updateAssociatedValue(_ updateValue: String) {
let mirror = Mirror(reflecting: self)
for associatedValue in mirror.children {
guard let value = associatedValue.value as? EnumValue<String> else {
continue
}
value.value = updateValue
}
}
事物可以正常编译,但是在运行时Guard语句期间始终会失败。我是否以某种不正确的方式使用通用值?我应该以某种方式使用updateValue.
Type还是updateValue.self
(我尝试过,但是没有用)。
用法示例:
var array: [PersonInfo] = [
.firstName(PersonInfo.EnumValue("John")),
.lastName(PersonInfo.EnumValue("Doe")),
.isAdult(PersonInfo.EnumValue(false))
]
print(array)
// John, Doe, false
array.first?.updateAssociatedValue("Mike")
print(array)
// Mike, Doe, false
我总是可以在数组中重新分配枚举值,但如果可能的话,我想避免这种情况。这就是问这个问题的原因。