Swift 4に変換でNSKeyedUnarchiverがエラー

macOS High SierraになりSwiftも4にバージョンアップ。
TouchdownもSwift 3からSwift 4に移行します。

基本的にはXcodeの移行ツールに従うだけで、途中で聞かれる

  • Minimize Inference
  • Match Swift 3 Behavior

もせっかくなのでSwift 4推奨のMinimize Inferenceを選択しました。

ワーニングやエラーを手動で修正して実行したところ、以下のエラーが発生。

[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (ConvertSetting) for key (NS.objects); the class may be defined in source code or a library that is not linked

Swift 3版でConvertSettingというクラスをarchiveして保存していたのですが、Swift 4版では互換性がなくなり復元できなくなってしまいました。

原因を調べてみたところ、Swift 3では自動で付与されていた@objcが、Swift 4では自動で付与されなくなり、今後は明示的に記述する必要があるようです。

つまり、もともとCocoa BindingのためConvertSettingには暗黙で@objcが付いていたのが、Swift 4以降のタイミングで付与されなくなったと予想。

クラス定義の部分に
@objc(ConvertSetting)
を追記することで解決しました。
Cocoa Bindingのため@objcMembersも記載してあります。

というわけで、Swift 4(macOS High Sierra)版Touchdownは既知の不具合などを修正してからリリース予定です。

0 件のコメント:

コメントを投稿

Touchdown 1.2公開!

Touchdown 1.2を公開しました。 ダウンロードは こちら から。 Ver.1.2の変更点は以下の通りです。 新機能 macOS High Sierra 10.13以降に対応 コマンドキーを押しながら起動することで設定を保存しない機能を追加 一...