Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2018年12月17日

adachi

Reactive Swift に Completable 的なものを導入した話

こんにちは。
ピクトリンク事業部の足立です。

ピクトリンクはプリントシール機で撮影した画像データを使ったコミュニケーションツールで、私はそのiOS版のアプリの開発を担当をしてます。

 

最近は、12/10に遅ればせながら、スマブラSPを買いました👋
一応ほぼ全作やっているので、使命感に駆られるように、大乱闘を繰り広げる毎日でちょっと寝不足気味です😪
アドベンチャーモード、ふつうレベルでも意外に難しく苦戦しています。楽しいです✨

 

では、本題に入りたいと思います。

 

この記事は フリュー Advent Calendar 2018 の 12/17(月) の記事になります。
今回はピクトリンクアプリの開発で導入している Reactive Swift をプロジェクト内でカスタマイズしたお話です。

 

きっかけ

ある日のPRレビューを実施していた時のことです。
 
足立
  「ここ SignalProducer<Void, HogeError> なんですけど、呼び出し元が observer.sendCompleted() しかしていないので then(_:) で繋げないと動かないと思いますよ」

メンバーM
  「え、そうなんですか? I/Fの定義だけだとわかりにくいし、なんとかならないんですかね」
 

的な会話が繰り広げられていました。

たしかに、SignalProducer<Void, HogeError> だけを見ると completed イベントしか通知されるとは思いませんよね。
実装をするたびに、関数の中を調べるなんて時間の無駄ですし、そんなわかりにくい設計は無くすべきです。

 

ということで Completable 的なものを導入する

「じゃあ、どんな感じにしようか?」
 

と、設計しているときに「完了のみの通知だし Completed? Completable? 的な感じですかねー」と進んでいき RxSwift 的には似たような機能はないのか?
と調べ始めました。
 

ありました。RxSwift / Completable

Completable についての詳しい説明はここではしませんが、 Completable そのものを返却できるような設計のようです。
Reactive Swift でそこまでのカスタマイズをするとなると、とてもじゃあないですが大変です💦
 

そこで、弊社iOSアプリ開発チームでは 専用のオブジェクトを通知することで Completable のような扱いにする としました。

 

やったこと

  • 通知に使う専用のオブジェクトを作成
  • Completable の時に使わないメソッドの非推奨化

 

通知に使う専用のオブジェクトを作成

こんな感じで Completable を定義しました。

`Completable` の時に使わないメソッドの非推奨化

通知されるイベントが completed のみになるので、間違った実装にならないために、 SignalProducerSignal などで定義されている幾つかのメソッドを利用させないようにします。
ReactiveSwift / UninhabitedTypeGuards.swift を参考にしました。
 

主に startWith***flatMap など value イベントの通知で使用するメソッド周りです。
以下は SignalProducer 周りの定義を抜粋しています。

 

使い方

基本的には通常の Reactive Swift の実装通りです。
Value の指定を Completable にするだけです。

 

まとめ

導入した結果としては、とても良かったと思います。
きっかけ でも触れましたが、PRレビューの際の
 

  • completed イベントのみしかこない実装ではないか?
  • value イベントが通知される前提の実装になっていないか?
     

などの、メソッドの定義をだけでなく実装の中身まで遡って見る必要がなくなったと思います。
   = PRレビューでの不要な指摘も減る(する側もされる側もハッピー😉)
 

実装するときも CompletableTypeGuards.swift の設定のおかげで間違った実装を防げるのも地味に良かったりします。
慣れていけば 使えない ことはわかっていきますが、プロジェクトにJOINしてきた人たちにとってはWarning表示という目に見えるカタチで知らせてくれるのも良い感じです。
 

と、ここまで良かった点を書いてきましたが、念のために。
Completable の使用にあたっては用法/用量をまもって欲しいと思います。
便利だからといって 「本当に Completable の通知で良いのか?」 という「その機能の責務」を考えずに実装を進めることは、その時は良くても数週間後、数ヶ月後にタイヘンなことになるかも・・・😇

 


2017年01月30日

adachi

try! Swift Tokyo 2017 に協賛します!!

こんにちは
コンテンツ・メディア第1事業部の足立です。
ピクトリンクというプリントシール機で撮影した画像データを使ったコミュニケーションアプリのiOS版の開発を担当しています。

 

弊社は2016年に引き続き3月2日から行われる try! Swift というイベントにシルバースポンサーとして協賛させていただきます。

 

try! Swift

HP: https://www.tryswift.co/tokyo/jp
スケジュール: https://www.tryswift.co/tokyo/jp#schedule

「try! Swift」はプログラミング言語Swiftに関するコミュニティ主催のカンファレンスです。
ベストプラクティス、アプリケーション開発、サーバーサイドSwift、オープンソースSwiftなど、Swiftに関する技術情報とコミュニケーションを目的に2017年3月2日〜4日の3日間にわたって開催されます。

 

去年は3日間全て講演でしたが、今年は3日目は参加者によるハッカソンを行うようです。
また、登壇者の講演とは別に、try! Swift の参加者によるライトニングトークセッションも用意されています。

 

登壇者による講演もですが、ライトニングトークでどの様な発表を聴けるか楽しみですね

 

Swiftを使用した開発について

弊社の手掛ける ピクトリンク というiOSアプリ(Android版, Web版あります)では、 Swift を使用して開発を進めています。

 

2014年のWWDCで Swift のBeta版が発表された頃、アプリの全面的なリニューアルを行っていました。
その頃に思い切って「Swiftへ移行しましょう。今変えないでいつ変えるんですか」的なことをチーム内で提案したのを覚えています。
発表まもないうえに初めての言語でしたので、 Objective-C からの作り変えに楽しくも辛い(?)日々が良い思い出です。

 

SwiftVersion 1.0, 2.0 そして Version 3.0 と約2年をかけてバージョンアップされて来ました。
バージョンアップによる言語仕様の変更などに伴う修正などは覚悟してしていましたが、大幅な仕様変更には泣かされました。
ですが Objective-C から Swift へ移行することで、Optional・Optional Chainning などを利用できる様になり、開発効率や可読性などが大幅に上がりました。
今ではあの頃に Objective-C から Swift へ移行しておいて本当によかったと思っています。

 

まだ、Swift が怖くて手が出せてない方や、Objective-C からの移行コストを気にして Swift に移行できていない方がいるとおもいますが、
今、この Tech Blog を見た瞬間から1行、1機能でも良いのでぜひ Swift で実装してみてはいかがでしょうか!?

 

みなさんもぜひ try! Swift してみませんか。
Swift 楽しいですよ!!

 

去年の記事: try! Swiftに協賛します