泛型类中的“分段错误:11”

时间:2017-09-15 15:20:02

标签: swift generics segmentation-fault swift4

我正在尝试在Swift 4中创建一个简单的类型擦除结构:

protocol DataProvider
{
  associatedtype ItemType

  subscript(index: Int) -> ItemType { get }
}

struct AnyDataProvider<providerType: DataProvider> : DataProvider
{
  private var _subscript: (_ index: Int) -> providerType.ItemType

  init<P : DataProvider>(_ base: P) where P.ItemType == providerType.ItemType
  {
    _subscript = base.subscript
  }

  subscript(index: Int) -> providerType.ItemType
  {
    return _subscript(index)
  }
}

但是我遇到了一个分段错误:11在声明初始化的行上。

除了将其报告为错误外,还有什么想法?

1 个答案:

答案 0 :(得分:0)

YESSS!

问题是你不能将下标“方法”分配给闭包引用。

为实现这一目标,来自Apple的Slava Pestov向我展示了分配匿名闭包的技巧,该闭包调用了下标。

以下是完成的代码:

protocol DataProvider
{
  associatedtype ItemType

  subscript(index: Int) -> ItemType { get }
}

struct AnyDataProvider<itemType> : DataProvider
{
  private let _subscript: (Int) -> itemType

  subscript(index: Int) -> itemType
  {
    return _subscript(index)
  }

  init<providerType : DataProvider>(_ base: providerType) where providerType.ItemType == itemType
  {
    _subscript = { base[$0] }
  }
}