Swift
Swift3.0

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

More than 1 year has passed since last update.


概要

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