将函数通用参数转发到通用类类型

时间:2020-11-04 15:58:29

标签: swift generics enums

我创建了具有关联值的枚举,并且希望能够动态更新关联值。据我所知,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

我总是可以在数组中重新分配枚举值,但如果可能的话,我想避免这种情况。这就是问这个问题的原因。

0 个答案:

没有答案