我正在使用 Swift 2 和 Xcode 7.3 开发一个项目,遇到了一个错误,我还无法理解原因。
我创建了一个名为 Resource
的协议(protocol),它有一个 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()
对这里可能发生的事情有什么想法吗?
编辑:
正如 Alexander 所指出的,即使我将通话分为:
let localObjects = Model.localObjects
let allObjects = localObjects.all()
...它仍然在第一行崩溃。
最佳答案
这是一个编译器错误,导致访问 localObjects
属性时堆栈溢出。据我所知,这是您的类型之间的递归依赖性问题,更具体地说, localObjects
是通过动态调度调用的。如果我从 Resource
中删除 static var localObjects: ResourceFinderType { get }
它会起作用。
或者,如果您从 ResourceFinder
中删除 Resource
约束,它也会成功运行。
我已经报告了这个问题,你可以通过 SR-1314 跟踪它
关于Swift:EXC_BAD_ACCESS 从实现协议(protocol)的泛型类型调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36845485/