我正在尝试在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个。
有什么想法,除了将其报告为错误吗?
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] }
}
}