我有一些项目,我为我的需要创建了方便的架构,所有事情都很好,直到我在运行时遇到EXC_BAD_ACCESS
的神秘崩溃。我发布了here代表问题的最小代码,这里是解释:
想象一下protocol
和另一个是第一个孩子:
protocol Base {
static var key: String { get }
}
protocol BaseChild: Base {
}
以下是一些简单的实现:
struct ChildEntity: BaseChild {
static var key: String {
return "key"
}
}
然后,我有一些与这些实体合作的课程:
class Worker {
static var defaultWorker: Worker? // will explain later
func work<T: Base>(entity: T) {
print(T.key)
}
}
我还有一些Worker
的子类:
class ChildWorker: Worker {
override func work<T: BaseChild>(entity: T) {
print(T.key)
}
}
到目前为止一切顺利。然后我将静态defaultWorker
var添加到我的Worker
类中,以便更轻松地访问我的默认工作程序,这允许我为Base
协议创建一个扩展,该扩展将与我的{{1}一起使用}}:
defaultWorker
然而,这会在运行时生成extension Base {
func work() {
Worker.defaultWorker?.work(entity: self)
}
}
。这是一个简单的用法:
EXC_BAD_ACCESS
我使用Swift 3和Swift 4在Xcode 8和Xcode 9上测试了这个。请帮我解决这个问题
答案 0 :(得分:0)
我想知道为什么要将func work<T: Base>(entity: T)
覆盖为override func work<T: BaseChild >(entity: T)
?
那不应该是override func work<T: Base>(entity: T)
吗?