Brew the Mash

クラフトビール好きなITエンジニア@mashmorgan_jpの開発メモなど

【iOS】Swift4対応したらKVOが動かなくなった件

個人メモです。

XCode9にアップデートしてSwift4の自動変換をかましたらKVO関連の処理が動かなくなってしまいました。 addobserverなどで使用している#selectorと#keypathがdeprecateらしく警告されますが、エラーにはならないのでひとまずそのままビルド。 するとどうやらKVOがまったく動作していない模様。。。

結論から言うと自分の確認ミスでした。 Swift4の自動変換をかました際に、dynamicがdeprecatedになったため削除してしまっていたようです。 「@objc dynamic」を追加することで動作確認できました。

// Swift3
dynamic var hoge :String = "aaa"

// Swift4(誤)
var hoge :String = "aaa"

// Swift4(正)
@objc dynamic var hoge :String = "aaa"

KVOはdynamic指定しないと動作しないという基本を忘れていました。。。 Observer処理を全部差し替えすることも考えましたが今回は回避できました。 が、そろそろ時間を見つけて最新対応しなければXCode10あたりで泣きを見ることになりそうです。 (宿題が増える一方ですね)