2016-04-25 33 views
11

Sto lavorando a un progetto con Swift 2 e Xcode 7.3 e affronta un errore che non riesco ancora a capire il motivo.Swift: EXC_BAD_ACCESS chiama un metodo da un tipo generico che implementa un protocollo

Ho creato un protocollo chiamato Resource che ha un associatedtype e un static var di quel tipo.

Dentro la sua estensione, io sto cercando di creare un implementazione predefinita di getter s' il static var, in cui il tipo è un generico struct che implementa un altro chiamato ResourceFinderProtocol.

Compilare tutto bene ma, in fase di esecuzione, quando si esegue l'ultima riga dello snippet di seguito, produce un arresto anomalo EXC_BAD_ACCESS.

Se faccio il struct ResourceFinder non generico, funziona senza intoppi.

protocol Resource { 
    associatedtype ResourceFinderType 
    static var localObjects: ResourceFinderType { get } 
} 

extension Resource { 
    static var localObjects: ResourceFinder<Self> { 
     return ResourceFinder() 
    } 
} 

public protocol ResourceFinderProtocol { 
    associatedtype ResourceType 
    func all() -> [ResourceType] 
} 

struct ResourceFinder<T:Resource>: ResourceFinderProtocol { 
    func all() -> [T] { 
     return [] 
    } 
} 

struct Model: Resource {} 

Model.localObjects.all() 

Qualche idea di cosa può accadere qui?

EDIT:

Come Alexander sottolineato, anche se ho diviso la chiamata in:

let localObjects = Model.localObjects 
let allObjects = localObjects.all() 

... si blocca ancora in prima linea.

+0

A proposito, 'Model.localObjects' si blocca anche. –

risposta

5

Si tratta di un errore del compilatore, che ha causato un sovraccarico dello stack quando si accede alla proprietà localObjects. Da quello che posso raccogliere, si tratta di un problema con una dipendenza ricorsiva tra i tuoi tipi, e più specificatamente che localObjects viene invocato tramite l'invio dinamico. Se rimuovo lo static var localObjects: ResourceFinderType { get } da Resource, funziona.

In alternativa, se si rimuove il vincolo Resource da ResourceFinder, verrà eseguito anche correttamente.

ho riportato il problema e potete seguirli via SR-1314

+1

Grazie per aver segnalato il problema, Stuart. Hanno già segnato come risolto come sembra essere stato risolto sul master. Quindi la correzione arriva nella prossima versione. –

+2

Ho confermato che funziona anche con il 04-25 3.0 SNAPSHOT –