2017-07-16 50 views
2

我有一些项目,我为我的需要创建了方便的架构,所有的事情都很好,直到我在运行时遇到了EXC_BAD_ACCESS的神秘崩溃。我张贴here代表的问题,在这里最小码的解释是:简单代码中的神秘EXC_BAD_ACCESS

想象一些,另一个是第一的孩子:

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协议的扩展,它会与我defaultWorker工作:

extension Base { 

    func work() { 
     Worker.defaultWorker?.work(entity: self) 
    } 
} 

然而,这产生EXC_BAD_ACCESS在运行时。下面是简单的使用:

class Test { 

    static func run() { 
     let object = ChildEntity() 
     let worker = ChildWorker() 
     worker.work(entity: object) // OK here 

     Worker.defaultWorker = worker 
     object.work() // EXC_BAD_ACCESS here 
    } 
} 

我斯威夫特3和斯威夫特测试了这个在Xcode中8和9的Xcode 4都请帮我解决这个问题

+0

尝试做'object.work'(删除'()')...或者离开它并且执行'Test.run' –

+0

@ l'L我很感谢你,但是这样做有什么意义?我可以通过简单评论这条线获得相同的结果。我的意思是删除括号将停止执行我的功能,但我需要它的工作 – Azat

+0

这对发生了什么是有帮助的...错误在'Worker.defaultWorker?.work(entity:self)' –

回答

0

我不知道为什么你重写func work<T: Base>(entity: T)override func work<T: BaseChild >(entity: T)

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

+0

我希望我的孩子工作者只能用'BaseChild'实例,所以我试图缩小编译器级别的可能调用。但是当我这样做时,它说我缺少'override'关键字,然后编译器很高兴 – Azat