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

时间:2016-04-25 15:55:56

标签: swift generics swift2 protocols

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

我创建了一个名为Resource的协议,该协议具有该类型的associatedtypestatic 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()

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

1 个答案:

答案 0 :(得分:5)

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

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

我已报告此问题,您可以通过SR-1314

跟踪该问题