“分段错误: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 。

任何想法,除了报告它作为一个错误吗?

+0

这不是类型擦除。你的'AnyDataProvider'由一个'DataProvider'参数化。你所要做的就是试着将一个DataProvider看作是一个不同的DataProvider(没有明显的好处,因为类型相同)。如果你真的想擦除DataProvider,那么你的'AnyDataProvider'应该由'ItemType'本身来参数化,而不是'DataProvider'。 –

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] } 
    } 
}