シェルスクリプトから複数の画像とテキストの組み合わせをリスト表示させたいような場合に、単機能のTableView Cocoa Appがほしくなりました。
ダイアログだけだったらosascriptやCocoa Dialogで事足りるのですが、TableViewは出せないみたいです。(Echofon for Macみたいな見た目のを出したい)
コマンドラインから起動する前提だと、Application Bundle(.app)も邪魔だしな・・・(NSBundleは素晴らしい仕組みですが要らないときはいらない)
単機能のSwift Cocoaアプリをつくる
Single-file Cocoa application with Swift で紹介されていたSwiftスクリプト 1ファイルで書くCocoaアプリケーションがやりたいことにマッチしそうだったので試してみました。
Case 2. Minimal windowed application
を起動してみたところ、エラーがいくつかでて動きません。
Swift4でいろいろ変わったようなので、リファレンスを見ながら修正します。
修正したコード
#!/usr/bin/swift
import Cocoa
let window = NSWindow.init(
contentRect: NSMakeRect(0, 0, 320, 200),
styleMask: [.titled],
backing: .buffered,
defer: true
)
window.orderFrontRegardless()
NSApp.run()
実行結果
Cocoaアプリケーションをビルドしてみる
swiftc
コマンドを使うとさっきまで動かしていたスクリプトをそのままビルドできます。便利だな。
swiftc -o window window.swift
実行は、
./window
起動超速い。
バイナリもたったの55kBでした。
$ ls -alh
total 120
drwxr-xr-x 4 miminashi staff 136B 12 27 09:02 .
drwxr-xr-x 77 miminashi staff 2.6K 12 27 07:19 ..
-rwxr-xr-x 1 miminashi staff 55K 12 27 09:02 window
-rwxr-xr-x 1 miminashi staff 220B 12 27 08:28 window.swift
ところでこのバイナリはポータブルなんだろうか・・・?
複数起動してみる
シェルスクリプトアドベントカレンダーなので一応シェルスクリプト(というかただのワンライナーだけど)も書きます。
複数個のCocoaアプリケーションを起動してみます。
$ ./window | ./window | ./window
パイプで繋いでるのはあんまり意味ないけど。
まとめ
- AppKitのSwiftAPIがドラスティックに変わっているのと、Xcodeで普通にMac Appをつくる場合は触らないようなAPIを呼び出してるので、新しいAPIの呼び出し方を調べるのがちょっと大変だったが、それ以外は思ったより簡単だった
- 次回は実際にNSTableViewを備えたアプリに仕立てたい