Cocoa
MacApp
シェルスクリプト
Swift

Swift4でウィンドウを表示するだけのCocoaアプリケーションをつくってみた

シェルスクリプトから複数の画像とテキストの組み合わせをリスト表示させたいような場合に、単機能の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でいろいろ変わったようなので、リファレンスを見ながら修正します。


修正したコード


window.swift

#!/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()



実行結果

スクリーンショット 2018-12-27 8.53.29.b.png


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

スクリーンショット 2018-12-27 9.08.48.png

パイプで繋いでるのはあんまり意味ないけど。


まとめ


  • AppKitのSwiftAPIがドラスティックに変わっているのと、Xcodeで普通にMac Appをつくる場合は触らないようなAPIを呼び出してるので、新しいAPIの呼び出し方を調べるのがちょっと大変だったが、それ以外は思ったより簡単だった

  • 次回は実際にNSTableViewを備えたアプリに仕立てたい