Touchdown ver.1.2向け追加予定機能

macOS High Sierraがリリースされて1ヶ月ほど経ちましたが、Touchdown も近日中にVer. 1.2へバージョンアップします。

変更予定箇所は以下の通り。
  • macOS High Sierra 10.13以降に対応
  • コマンドキーを押しながら起動すると、設定の変更が保存されないように
  • 設定で数値を変更しても、適用されない事がある不具合を修正

Swift 4に移行したらファイルのドラッグ時にパスが取り出せない?

TouchdownをSwift 4に変換した際に、フレームワーク側の変更に伴うコードの置換が発生していました。

ファイルのドラッグ&ドロップに関する部分ではドラッグ受付登録が、
register(forDraggedTypes: [NSFilenamesPboardType]);
から
registerForDraggedTypes([NSPasteboard.PasteboardType.fileURL]);
になっています。

NSFilenamesPboardTypeの代わりにfileURLを使うようになったようです。

これに合わせてペーストボードから値を取得する部分が
sender.draggingPasteboard().propertyList(forType: NSPasteboard.PasteboardType.fileURL) as? [String]
のようなコードに置換されたのですが、ここでエラーが発生。

sender.draggingPasteboard().typesにfileURLが含まれているにも関わらず、どうも[String]にうまくキャストできていないようです。

色々調べたところ以下のコードがうまく動きました。
sender.draggingPasteboard().propertyList(forType: NSPasteboard.PasteboardType(rawValue: "NSFilenamesPboardType")) as? [String]

フレームワーク側の不具合でしょうか?
ひとまずワークアラウンドとしてこの対応で進めることにします。

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は既知の不具合などを修正してからリリース予定です。

Touchdown 1.3公開!

Touchdown 1.3を公開しました。 ダウンロードは こちら から。 Ver.1.3の変更点は以下の通りです。 新機能 macOS Mojave 10.13以降に対応 ダークモードに対応 ぜひお試しください。