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