LoginSignup
5
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-24

概要

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 }
    }
    // 省略
  }
}
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3