2017-09-15 66 views
0

我試圖創建斯威夫特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'。 –

回答

0

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