神秘的EXC_BAD_ACCESS简单代码

时间:2017-07-16 22:34:57

标签: swift xcode exc-bad-access

我有一些项目,我为我的需要创建了方便的架构,所有事情都很好,直到我在运行时遇到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上测试了这个。请帮我解决这个问题

1 个答案:

答案 0 :(得分:0)

我想知道为什么要将func work<T: Base>(entity: T)覆盖为override func work<T: BaseChild >(entity: T)

那不应该是override func work<T: Base>(entity: T)吗?