加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

泛型 – Swift枚举中通用关联值的确切限制是什么?

发布时间:2020-12-14 05:36:55 所属栏目:百科 来源:网络整理
导读:我想通过 Swift了解具有通用关联值的枚举的确切限制. 您可能会认为它们是受支持的,因为可选是这样的类型.以下是Swift标准库中可选的代码: enum OptionalT : Reflectable,NilLiteralConvertible { case None case Some(T)// ...} 看起来像case一些有变量类型
我想通过 Swift了解具有通用关联值的枚举的确切限制.

您可能会认为它们是受支持的,因为可选是这样的类型.以下是Swift标准库中可选的代码:

enum Optional<T> : Reflectable,NilLiteralConvertible {
    case None
    case Some(T)
// ...
}

看起来像case一些有变量类型T的关联值,对吗?

但是,在Functional Programming in Swift(第87页)中提到,不支持这种类型:

We would like to define a new enumeration that is generic in the
result associated with Success:

06001

Unfortunately,generic associated values are not supported by the current Swift compiler.

实际上,如果您将该代码片段编入编译器,则会收到错误(错误:未实现的IR生成功能非固定多有效载荷枚举布局).

那么这里发生了什么?只是它一般不支持,但是作为特殊情况支持可选?有什么办法可以看到Optional如何获得这种特殊支持?或者如果其他标准库类型也得到特殊支持?

这个答案在Swift 2中已经过时了.请参阅rickster对Swift 2更新的回答.

您的意见是正确的.如果其中任何一个具有未知的大小,您不能有多个案例与关联的数据.值类型可以是任何大小(因为它们被复制).引用类型(如对象)具有已知大小,因为它们存储指针.

典型的解决方案是创建一个额外的包装类来保存泛型类型,就像FP书一样.每个人都按惯例称之为Box.有理由希望Swift团队今后能够解决这个问题.正如你所说,他们把它称为“未实现的”而不是“不支持”.

Box的典型实现:

final public class Box<T> {
  public let unbox: T
  public init(_ value: T) { self.unbox = value }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读