[swift-users] Can't implement generic subscript in protocol

Slava Pestov spestov at apple.com
Fri Sep 15 18:26:44 CDT 2017


> On Sep 15, 2017, at 12:40 PM, Joanna Carter via swift-users <swift-users at swift.org> wrote:
> 
> Xcode Version 9.0 (9A235)
> 
> Hmmm. I'm now getting a segmentation fault : 11 on a constructor when trying to implement type erasure :

Swift 4.0 had issues with members and member references named ‘subscript’. On master, I get the correct error message without crashing:

Slavas-MBP:swift slava$ ../build/Ninja-ReleaseAssert/swift-macosx-x86_64/bin/swiftc sub.swift 
sub.swift:22:17: error: value of type 'providerType' has no member 'subscript'
   _subscript = base.subscript
                ^~~~ ~~~~~~~~~

Indeed you’re not supposed to be able to refer to a subscript member like this. You could use a keypath, or try some other approach.

Slava

> 
> protocol DataProvider
> {
>  associatedtype ItemType
> 
>  subscript(index: Int) -> ItemType { get }
> }
> 
> class _AnyDataProviderBoxBase<itemType>: DataProvider
> {
>  subscript(index: Int) -> itemType
>  {
>    fatalError()
>  }
> }
> 
> class _AnyDataProviderBox<providerType: DataProvider>: _AnyDataProviderBoxBase<providerType.ItemType>
> {
>  private let _subscript: (_ index: Int) -> providerType.ItemType
> 
>  init(_ base: providerType) // segmentation fault : 11
>  {
>    _subscript = base.subscript
>  }
> 
>  override subscript(index: Int) -> providerType.ItemType
>  {
>    return _subscript(index)
>  }
> }
> 
> final class AnyDataProvider<providerType : DataProvider>: DataProvider
> {
>  private let box: _AnyDataProviderBox<providerType>
> 
>  init(_ base: providerType)
>  {
>    self.box = _AnyDataProviderBox(base)
>  }
> 
>  subscript(index: Int) -> providerType.ItemType
>  {
>    return box[index]
>  }
> }
> 
> Joanna
> 
> --
> Joanna Carter
> Carter Consulting
> 
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users



More information about the swift-users mailing list