2017-07-16 51 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