【问题标题】:Cast Generic type of any任何类型的 Cast 通用类型
【发布时间】:2017-12-16 00:59:35
【问题描述】:

假设我有一个这样的结构:

struct GenericStruct<T>

现在我有一个Any 数组,并且想从这个数组中获取所有GenericStructs,不管泛型类型是什么。我原以为这会起作用:

let arrayOfGenericStructs = arrayOfAny.flatMap { $0 as? GenericStruct<Any> }

但事实并非如此。

我需要做什么才能获得所有GenericStructs 的数组?

【问题讨论】:

  • 你在这里得到的被称为存在类型,而 Swift 还没有它们。 C<T> 不能转换为C<Any>。您需要使用type eraser

标签: swift generics


【解决方案1】:

我找到了一种丑陋的解决方案:

我定义了GenericStructProtocol 所遵循的协议GenericStruct。现在我可以像这样创建一个GenericStructs 数组:

let arrayOfContainers = arrayOfAny.flatMap { $0 as? GenericStructProtocol }

仍然想知道这样做的正确方法是什么。

【讨论】:

  • 这并不难看,这正确的方法。使用Any 作为我不在乎的不在场证明是丑陋的。
  • @vadian 丑陋的是,当您查看代码时,您无法阅读逻辑上实际执行的操作,但您会看到一些“语言限制解决方法实现细节”。
猜你喜欢
  • 2021-06-12
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多