2016-04-25 71 views
11

我正在使用Swift 2和Xcode 7.3处理项目,并面临一个我无法理解原因的错误。Swift:EXC_BAD_ACCESS从实现协议的泛型类型调用方法

我已经创建了一个名为Resource的协议,其中有一个associatedtypestatic var这种类型。

里面它的扩展,我试图创建static var的吸气剂,其中类型是一个通用struct实现另一个称为ResourceFinderProtocol的默认实现。

这一切都编译好,但在运行时,当执行下面代码片段的最后一行时,它会产生一个EXC_BAD_ACCESS崩溃。

如果我使struct ResourceFinder不通用,它工作顺利。

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() 

有什么想法可以在这里发生什么?

编辑:

正如亚历山大指出,即使我分裂成电话:

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

...它仍然崩溃在第一线。

+0

跟踪它顺便说一句,'Model.localObjects'也崩溃。 –

回答

5

这是一个编译器错误,在访问localObjects属性时导致堆栈溢出。从我可以收集的信息来看,这是一个与类型之间的递归依赖关系的问题,更具体地说,localObjects是通过动态分派调用的。如果我从Resource中删除static var localObjects: ResourceFinderType { get }它可以工作。

或者,如果您从ResourceFinder删除Resource约束,它也将成功运行。

我已报告的问题,你可以通过SR-1314

+1

谢谢你报告问题,斯图尔特。他们已经标记为已解决,因为它似乎固定在主人身上。所以修补程序会在下一个版本中发布。 –

+2

我确认它也适用于04-25 3.0 SNAPSHOT –

相关问题