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

标签 swift generics swift2 protocols

我正在使用 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/

相关文章:

uitableview - ViewController 没有名为 tableview 的成员错误

generics - 带记录的静态解析类型

ios - 将 Parse Push Notifications 集成到 Xcode 7 项目中 (Swift)

swift - 为什么我的应用程序在加载 "indexPath.row"时崩溃?

ios - 我怎样才能使 iBeacons 私有(private)

ios - 如何在 SwiftUI 中与 GeometryReader 正确对齐

Swift 4、Firebase如何观察快照并转换成对象

接口(interface)的泛型、通配符和 super /扩展

c# - 通用方法参数的接口(interface)约束

objective-c - 如何在框架中使用 Swift 扩展 Objective-C 类?