実行時に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)
を上書きなぜ私が疑問に思うこの問題
'object.work'('() ')をやってみてください...それを残して' Test.run'を実行してください –
@ l'L'l'lありがとうございます。私は単にこのラインをコメントアウトして同じ結果を達成することができます。私は括弧を削除することは私の機能の実行を止めることを意味するが、私はそれを働かせる必要がある – Azat
何が起こっているのに役立つ...エラーは行 'Worker.defaultWorker?work(entity:self)' –