Swift:EXC_BAD_ACCESS从实现协议的泛型类型调用方法
我正在使用Swift 2和Xcode 7.3处理项目,并面临一个我无法理解原因的错误。Swift:EXC_BAD_ACCESS从实现协议的泛型类型调用方法
我已经创建了一个名为Resource
的协议,其中有一个associatedtype
和static 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()
...它仍然崩溃在第一线。
这是一个编译器错误,在访问localObjects
属性时导致堆栈溢出。从我可以收集的信息来看,这是一个与类型之间的递归依赖关系的问题,更具体地说,localObjects
是通过动态分派调用的。如果我从Resource
中删除static var localObjects: ResourceFinderType { get }
它可以工作。
或者,如果您从ResourceFinder
删除Resource
约束,它也将成功运行。
我已报告的问题,你可以通过SR-1314
谢谢你报告问题,斯图尔特。他们已经标记为已解决,因为它似乎固定在主人身上。所以修补程序会在下一个版本中发布。 –
我确认它也适用于04-25 3.0 SNAPSHOT –
跟踪它顺便说一句,'Model.localObjects'也崩溃。 –