Segmentation fault avec struct générique

J'essai de créer une struct pour un type erasure :



protocol DataProvider
{
associatedtype ItemType

subscript(index: Int) -> ItemType { get }
}

struct AnyDataProvider<providerType: DataProvider> : DataProvider
{
private var _subscript: (_ index: Int) -> providerType.ItemType

subscript(index: Int) -> providerType.ItemType
{
return _subscript(index)
}

init<P : DataProvider>(_ base: P) where P.ItemType == providerType.ItemType
{
_subscript = base.subscript
}
}

Mais je ne peux pas le compiler car je reçois un segmentation fault sur la ligne ou se trouve la déclaration pour l'init


 


des idées ?


Réponses

  • LexxisLexxis Membre
    septembre 2017 modifié #2

    L'accès à  base.subscript semble poser problème au compilateur. J'imagine que le compilateur devrait sortir une erreur si le subscrit n'est pas considéré comme une méthode.


     


    Simple supposition avec un test. En utilisant une "vrai" méthode cela compile.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Merci ! J'ai supposé que, étant donné qu'un subscript ressemble une méthode, que l'on puisse stocker une référence dans une var.


     


    Malheureusement, non  >:(


     


    Maintenant, j'ai :



    protocol DataProvider
    {
    associatedtype ItemType

    func `subscript`(_ index: Int) -> ItemType
    }

    Juste parce que je peux  >:D


  • Joanna CarterJoanna Carter Membre, Modérateur

    Plus sérieusement, voici le code, fait avec l'aide de Slava Pestov d'Apple qui m'a montré le truc pour assigner le subscript :



    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] }
    }
    }
Connectez-vous ou Inscrivez-vous pour répondre.