我正在使用Swift 2和Xcode 7.3开展项目,并面临一个我无法理解其原因的错误。
我创建了一个名为Resource
的协议,该协议具有该类型的associatedtype
和static var
。
在其扩展程序中,我尝试创建static var
的getter的默认实现,其中类型是实现另一个struct
的通用protocol
} 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 :(得分:5)
这是一个编译器错误,在访问localObjects
属性时导致堆栈溢出。从我可以收集的内容来看,这是一个问题,在您的类型之间存在递归依赖关系,更具体地说,通过动态调度调用localObjects
。如果我从static var localObjects: ResourceFinderType { get }
移除Resource
,则可以使用。
或者,如果您从Resource
删除ResourceFinder
约束,它也会成功运行。
我已报告此问题,您可以通过SR-1314
跟踪该问题