SwiftはApple以外のプラットフォームでも利用できるようになりました。iOSアプリ以外でも好きなようにSwiftを書けます。この講演では、CocoaやObjective-Cの機能を犠牲にせずに、クロスプラットフォームでSwiftを用いるときの実践的な書き方、テスト・デバッグ手法、について解説します。
私はJPともうします Realmという会社に努めています。
try! Swiftへようこそ 信じられないくらい多いですね
RealmははじめからSwiftを大切にしています。
どうやって開発環境を設定するか 適切なテストをどうするか、CIをどうするか。。
クロスプラットフォームSwiftを考えるとプラットフォームはいくつ有るのでしょうか。2つです。DarwinとLinux?実際には3つあります。Swiftバイナリ、オープンソースバージョンのSwift、 ほぼ三種類あるといえる。 Raspberry Piやアンドロイドでもかなりの作業が進んでいます。実際にはプラットフォームは沢山あるが、あらゆるところでSwiftを走らせたい。
純粋なSwiftを書けばどこでも走らせられるというのを理想にしていますが、じっさいにはうまく行っていない
Appleは迅速に作業を成し遂げましたが改善が必要です。
理想的にはクロスプラットフォームをするならコードを出来るだけクロスプラットフォームフレンドリにする。そして一つのデバイスで開発したい。Xcodeと、ツールチェーンと、DockerやCLI、Editorという環境が居る。
Xcode7.3ではツールチェーンを選択できる
だんだんややこしくなってくる
Dockerがオススメ。コンテナ型仮想化環境です。この場合必要なのはhomebrewだけで数コマンドで出来ます。
ここで重要なのはローカルなディレクトリをマウントしてDocker環境にマウントすることです。 そして好きなエディタで編集しながら開発ができます。
Swift Package Manager
是非オススメしたいのはSPMを使う時に自分のコードを細かいプロジェクトに分けることです。
そしてもう一つクロスプラットフォーム開発で遭遇するのは、見た目はシンプルだが隠された依存性が有る。ObjectiveCに依存しているとか。ダイナミックなメッセージとかですね。
これを何とかしないとクロスプラットフォームで開発できない。キャスティングもObjective-Cランタイムに依存しています。
それから非常に重要なフレームワークがあるのはDarwinだけ。これは今後対応するという決定がAppleでありました。
Linuxにインポートする時に非常にシンプルだと思ったのはResultライブラリです。イーザータイプのようなものです。Appleのフレームワークを使っておらず自分自身で成立する。 でもいくつか例外が有る、キャスティングエラーが発生する。一見ピュアスウィフトに見えても、うまく動かない
物を動かしてサポートしていく必要がある。
フラグメントのワークアラウドも必要。
#if
がたくさん必要になる。
アーキテクチャチェック、AppleFrameworkを使っていないか、Objective-Cランタイムを使っていないかなど。この辺は慣れていくしか無い。時間がたてば軽減していくと思われる。
テスト
数週間前の様子
依存性を扱うことが出来なかったり。最新では自動でテストターゲットを作ってくれる。
Linux環境では振る舞いが別になるケースが有る。DarwinXCTextではないのでテストファンクションが何か伝える必要がある。Darwinバージョンなら全部分かってくれる。でもだいぶわかりやすくなって良い。
CI
CIでは全てをテストしビルドメトリクスをとりましょう。 Travisはシンプル。
この3つで動かします
SPMを使うとちょっと複雑な設定が必要になります。
Linuxではそんなに複雑ではありません。
これで満足? いろいろやってみて、SwiftOpenSourceのプロジェクトに是非貢献してみてください。 Appleも歓迎すると思います。
QA
おそらくはない、Apple内で開発する。Xcode自体はOpensourceではない。 Swiftチームはいい仕事をした。頻繁にクラッシュしたSwiftはいまは安定している。殆どのIDEサポートは、Xcodeの外で行われている。SourceKitなど、ツールとしてはOpensourceされています、その中にはプラットフォームまたがるものも有る。本質的にはSourceKitをLinuxに入れてIDEサポートをするのは出来ると思います。
ツールチェーンの他の部分をOpenSourceすることでXcode自体はされない
ちょっと先の話になるかもしれないが、キャストのどの部分がResultライブラリに入っていてObjective-Cに依存しているのでしょうか
わからないです。ただ言えるのは、デバッグに苦労しています。コンパイラパーツのデバッギング、だけではなくSwiftProjectに入っているものは苦労しています。基本的にはもっと、私よりすぐれたデバッガになって解決するのがよい。あなたなら出来る!
うまく行かなかったらランタイムのせい?
手探りですね。なぜObjective-Cに依存していると思うかというと、型解決を利用しているので何らかの関係があると思っているが、他の部分が使われているかもしれない。
(おまけ:お隣さんの手)
「実践的クロスプラットフォームSwift ~異なるプラットフォーム上でSwiftを使ってみよう!!~」をトゥギャりました。 https://t.co/tULcQYVXlT
— トゥギャッター開発まとめ (@tg__dev) March 2, 2016
JPさんの今日の発表スライド。slackでシェアされてました。 #tryswiftconf https://t.co/1ovnA3CgUB
— Tsutsumi Shuichi (@shu223) March 2, 2016
気に入った記事は はてなブックマーク
はてなブックマークアプリiOS開発チームから来ました! はてなブックマークにはSwift特集があります! 良い記事を見逃さないように、ご利用ください! http://b.hatena.ne.jp/hotentry/it/Swift
そして良いまとめ記事があったらはてなブックマークでブックマークしましょう! try! Swift の記事で盛り上がると嬉しいです!