“分段错误:11”通用类
问题描述:
我试图创建斯威夫特4的简单类型消除结构:“分段错误:11”通用类
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!
问题是,您不能将下标“方法”分配给闭包引用。
为了达到这个目标,苹果公司的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] }
}
}
这不是类型擦除。你的'AnyDataProvider'由一个'DataProvider'参数化。你所要做的就是试着将一个DataProvider看作是一个不同的DataProvider(没有明显的好处,因为类型相同)。如果你真的想擦除DataProvider,那么你的'AnyDataProvider'应该由'ItemType'本身来参数化,而不是'DataProvider'。 –