Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

VALU Advent Calendar 2018,18日目の記事です!

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

そこで,今回は Linux でも動く Swift GUI,Gtk+ を Swift で扱うライブラリ,TomasLinhart/SwiftGtk の紹介を致します。

Ubuntu 環境構築

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

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 のために開発された multi-platform のGUIツールキットで,GNOME を始め,様々な部分で利用されています。

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

Terminal
sudo apt install -y libgtk-3-dev

Package.swift の編集

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

Terminal
$ sudo apt install -y vim git

Swift Package Manager を利用してプロジェクトを作成します。

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

$ vi Package.swift

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

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 に従います。

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

注意

今回Swiftから利用した TomasLinhart/SwiftGtk については MIT license にて配布されておりますが,一方で GTK+ 自体は

GTK+ is licensed under the GNU LGPL 2.1

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

「今年の」まとめ

VALU Advent Calendar 2018 にて Swift の魅力をお伝えしてきました。RxSwift や設計の話も好きですが,フィジカルコンピューティングやCocoa以外でのGUI開発など,少し変わった使い方も紹介致しました。

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

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

参照

YutoMizutani
iOS Tech Lead。RxSwiftが好き。設計が好き。
https://github.com/YutoMizutani
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away