1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

シェルスクリプトから複数の画像とテキストの組み合わせをリスト表示させたいような場合に、単機能の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を備えたアプリに仕立てたい
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?