読者です 読者をやめる 読者になる 読者になる

Swiftのジェネリクスで型引数を別の型引数の制約に利用するとCommand failed due to signal: Segmentation fault: 11(未解決)

Swift

原因の詳細までは特定できていませんが,該当箇所を修正すると直るのでそういうことだと思っています。Swift3.0です。

製作中のゲームのSKSceneにロジックをずらずら書いていくのはしんどそうなので,自前でMVCの雛形を用意し,SKSceneクラスでやることはイベントをそのままControllerに流すのとMVC保持程度にしたいなと思っています。 そこで,任意のシーンにMVCを持たせる際,MVCの組み合わせにゆるい制約をもたせようと軽いDI的な仕組みを実装してみたいのですが, class MVCContainer<M: BasicModel, V: BasicView, C: BasicController<M, V>> と書いた部分で Segmentation fault が発生してしまうようでした。

XCodeはコンパイル時までエラーも警告も出しません。なぜだろう。同じことをM,V,Cを指定して実現できる方法はあるのでしょうか。そこまでこだわる部分じゃないのですが,釈然としないので原因と解決案を探り中です。

import Foundation
import SpriteKit

class BasicModel {
  required init() {}
}

class BasicView: SKNode {
  required override init() {
    super.init()
  }
  
  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

class BasicController<M: BasicModel, V: BasicView> {
  let model: M
  let view: V

  required init(model: M, view: V) {
    self.model = model
    self.view = view
  }
}

class TestModel: BasicModel {
}

class TestView: BasicView {
}

class TestController: BasicController<TestModel, TestView> {
}

class MVCContainer<M: BasicModel, V: BasicView, C: BasicController<M, V>> {
  let model: M
  let view: V
  let controller: C
  
  init() {
    model = M()
    view = V()
    controller = C(model: model, view: view)
  }
}

class TestScene: BasicScene {
  let mvc = MVCContainer<TestModel, TestView, TestController>()
}