2017-07-16 12 views
2

実行時にEXC_BAD_ACCESSという不思議なクラッシュが発生するまで、私は自分のニーズに合った便利なアーキテクチャを作ったプロジェクトをいくつか持っています。いくつかの簡単な実装ここシンプルなコードで謎のEXC_BAD_ACCESS

protocol Base { 

    static var key: String { get } 
} 

protocol BaseChild: Base { 

} 

とされています:

struct ChildEntity: BaseChild { 

    static var key: String { 
     return "key" 
    } 
} 

は、最初の子であるいくつかのと別のものを想像:私はここでの問題を表し、最小のコードが説明されhere投稿しました

次に、私はそのようなエンティティで動作するクラスをいくつか持っています:

012これまでのところは良い

class ChildWorker: Worker { 

    override func work<T: BaseChild>(entity: T) { 
     print(T.key) 
    } 
} 

は私もWorkerのいくつかのサブクラスを持っています。

extension Base { 

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

しかし、これが発生しEXC_BAD_ACCESS、実行時に:その後、私は簡単に私のデフォルトの労働者へのアクセスを行うために、私のWorkerクラスに静的defaultWorker VARを追加、これは私が私のdefaultWorkerで動作します私のBaseプロトコルの拡張機能を作成することができます。

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とXcode 9の両方でこれをテストした。4.あなたがoverride func work<T: BaseChild >(entity: T)func work<T: Base>(entity: T)を上書きなぜ私が疑問に思うこの問題

+0

'object.work'('() ')をやってみてください...それを残して' Test.run'を実行してください –

+0

@ l'L'l'lありがとうございます。私は単にこのラインをコメントアウトして同じ結果を達成することができます。私は括弧を削除することは私の機能の実行を止めることを意味するが、私はそれを働かせる必要がある – Azat

+0

何が起こっているのに役立つ...エラーは行 'Worker.defaultWorker?work(entity:self)' –

答えて

0

を解決してください:ここでは簡単な使用方法ですか?

override func work<T: Base>(entity: T)ではありませんか?

+0

私の子供作業員は' BaseChild'コンパイルレベルで可能なコールを絞り込もうとしました。しかし、私がそうするとき、私は 'override'キーワードがなくなっていると言って、コンパイラは満足です – Azat

関連する問題