LinuxでもSwiftを使ってGUI開発をしたい!【SwiftGtk】

## はじめに

[VALU Advent Calendar 2018](https://qiita.com/advent-calendar/2018/valu)，18日目の記事です!

Swift がオープンソース化され，Swift が Linux 上でも動作するようになって久しい今日。
いくら Swift で諸々が書けるようになったとしても，アプリ開発者として Cocoa UI に親しんだ方々には，CLI のみで動く Swift には物足りないと思う方もいらっしゃるのではないでしょうか。

そこで，今回は Linux でも動く Swift GUI，[Gtk+](https://www.gtk.org) を Swift で扱うライブラリ，[TomasLinhart/SwiftGtk](https://github.com/TomasLinhart/SwiftGtk) の紹介を致します。

## Ubuntu 環境構築

- [Ubuntu 18.04.1 LTS](https://www.ubuntu.com/download/desktop) on VirtualBox ver 5.2.22 r126460
- Swift 4.2.1

初期化されたUbuntuにささっと Swift 4.2.1 を入れていきます。

```bash:Terminal
$ sudo apt install -y wget clang libpython2.7 libxml2 curl libbsd-dev
$ wget https://swift.org/builds/swift-4.2.1-release/ubuntu1804/swift-4.2.1-$ RELEASE/swift-4.2.1-RELEASE-ubuntu18.04.tar.gz
$ tar -zxvf swift-4.2.1-RELEASE-ubuntu18.04.tar.gz
$ sudo mv swift-4.2.1-RELEASE-ubuntu18.04 /usr/local/swift
$ echo 'export PATH="/usr/local/swift/usr/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```

以上の後，`swift -v` にて 「swift-4.2.1-RELEASE」 の文字が確認できれば完了です。

## Gtk のインストール

Gtk は [GIMP](https://www.gimp.org) のために開発された multi-platform のGUIツールキットで，[GNOME](https://www.gnome.org) を始め，[様々な部分](https://www.gtk.org/screenshots/)で利用されています。

インストールは以下の通りです。

```bash:Terminal
sudo apt install -y libgtk-3-dev
```

## Package.swift の編集

`Package.swift` の編集に(お好みで) `vim`，Package.swift の依存性解決のために `git` を導入します。

```bash:Terminal
$ sudo apt install -y vim git
```

[Swift Package Manager](https://github.com/apple/swift-package-manager) を利用してプロジェクトを作成します。

```bash:Terminal
$ mkdir test && cd $_
$ swift package init --type executable

$ vi Package.swift
```

次に `Package.swift` を編集します。 `SwiftGtk` の他に追加すべきものがある場合は追加しましょう。

```swift:Package.swift
// swift-tools-version:4.2
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "test",
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
        .package(url: "https://github.com/TomasLinhart/SwiftGtk", "0.3.1" ..< "0.4.0"),
    ],
    targets: [
        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
        // Targets can depend on other targets in this package, and on products in packages which this package depends on.
        .target(
            name: "test",
            dependencies: ["SwiftGtk"]),
        .testTarget(
            name: "testTests",
            dependencies: ["test"]),
    ]
)
```

## main.swift の編集

[https://github.com/TomasLinhart/SwiftGtk#demo](https://github.com/TomasLinhart/SwiftGtk#demo) に従います。

```swift:main.swift
import SwiftGtk

let app = Application(applicationId: "com.example.application")
app.run { window in
    window.title = "Hello World"
    window.defaultSize = Size(width: 400, height: 400)
    window.resizable = true

    let button = Button(label: "Press Me")
    button.clicked = { _ in
        let newWindow = Window(windowType: .topLevel)
        newWindow.title = "Just a window"
        newWindow.defaultSize = Size(width: 200, height: 200)
        let labelPressed = Label(text: "Oh, you pressed the button.")
        newWindow.add(labelPressed)

        newWindow.showAll()
    }

    window.add(button)
}
```

裏にタイポによるビルドエラーが見られますが，Swift でビルド，実行させたものが以下となります。

![ss 2018-12-18 at 14.18.00.png](https://qiita-image-store.s3.amazonaws.com/0/195913/987b2b94-a5da-2732-1249-5d34efd0bc63.png)

## 注意

今回Swiftから利用した [TomasLinhart/SwiftGtk](https://github.com/TomasLinhart/SwiftGtk) については [MIT license](https://github.com/TomasLinhart/SwiftGtk/blob/master/LICENSE.md) にて配布されておりますが，一方で [GTK+](https://www.gtk.org) 自体は 
> GTK+ is licensed under the GNU LGPL 2.1

LGPL の下で配布されており，注意が必要です。

## 「今年の」まとめ

[VALU Advent Calendar 2018](https://qiita.com/advent-calendar/2018/valu) にて Swift の魅力をお伝えしてきました。RxSwift や設計の話も好きですが，フィジカルコンピューティングやCocoa以外でのGUI開発など，少し変わった使い方も紹介致しました。

少しでも読者の皆さまに興味を持っていただけるきっかけに触れ，Swift の魅力をお伝えできればなと思います。

まだ今年はちょうど2週間ありますが，現在も，来年以降も，どんどん VALU のアプリは進化していきますので，応援の程よろしくお願い致します。

## 参照

- [Swift for Linux and graphical interface?](https://www.reddit.com/r/swift/comments/4ig0ic/swift_for_linux_and_graphical_interface/)
- [What is GTK+, and how can I use it?](https://www.gtk.org)
- [TomasLinhart/SwiftGtk](https://github.com/TomasLinhart/SwiftGtk)
- [Ubuntu 18.04.1 LTS](https://www.ubuntu.com/download/desktop)
- [Swift Package Manager](https://github.com/apple/swift-package-manager)