Swift:EXC_BAD_ACCESS从实现协议的泛型类型调用方法

Gus*_*osa 11 generics protocols swift swift2

我正在开发一个使用Swift 2和Xcode 7.3的项目,并面临一个我无法理解原因的错误.

我创建了一个名为Resourcea associatedtype和a static var的协议.

在它的扩展中,我正在尝试创建static vargetter 的默认实现,其中类型是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()
Run Code Online (Sandbox Code Playgroud)

关于这里可能发生什么的任何想法?

编辑:

正如亚历山大指出的那样,即使我把电话分成:

let localObjects = Model.localObjects
let allObjects = localObjects.all()
Run Code Online (Sandbox Code Playgroud)

......它仍然在第一行崩溃.

Stu*_*nie 5

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

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

我已经报告了这个问题,您可以通过SR-1314进行跟踪

  • 我确认它也适用于04-25 3.0 SNAPSHOT (2认同)