Swift3でdynamicTypeからtype(of:)になったさいにクラス同一判定で躓いたこと


概要

Swift2.2プロジェクトをXcode8にしてSwift3にしてエラーをポチポチ潰していたのですが、dynamicTypeで少し躓いたので共有しておきます。

内容

Swift2.2

下記プログラムは、Swift2.2で書いてました。
渡されたUIViewControllerのサブクラス(Hoge/Fuga)が、既にセット済みであれば、即終了する処理です。


class HogeViewController : UIViewController{}
class FugaViewController : UIViewController{}

class MenuViewController : UIViewController{

  var contentViewController:UIViewController!

  func setContentViewController(contentViewController:UIViewController){
    guard self.contentViewController.dynamicType != contentViewController.dynamicType else { return }
    // 省略
  }
}

Swift3

Swift3+Xcode8では次のようにdynamicTypeからtype(of:)にエラー補完されました。

class HogeViewController : UIViewController{}
class FugaViewController : UIViewController{}

class MenuViewController : UIViewController{

  private var contentViewController:UIViewController!

  func setContentViewController(contentViewController:UIViewController){
    guard type(of:self.contentViewController) != type(of:contentViewController) else { return }
    // 省略
  }
}

実行結果

正常に動きません。

結果

次のようにif let でunwrapしてから判定するようにしました。

class HogeViewController : UIViewController{}
class FugaViewController : UIViewController{}

class MenuViewController : UIViewController{

  private var contentViewController:UIViewController!

  func set(contentViewController:UIViewController){
    if let currentContentViewController = self.contentViewController {
      guard type(of:currentContentViewController) != type(of:contentViewController) else { return }
    }
    // 省略
  }
}