1. Qiita
  2. Items
  3. Swift

ズンドコキヨシ with RxSwift

  • 49
    Like
  • 3
    Comment

元ネタ

RxSwiftで書いてみた

ズンドコが延々と流れてくるズンドコ川を作って、scanで直近5件の配列を作り、[ズン,ズン,ズン,ズン,ドコ]になるまでtakeWhileしたらできました。RxSwift 2.2.0で動きます。

import RxSwift
import Foundation

enum ズンドコ: UInt32 {
    case ズン
    case ドコ
}

let ズンドコ川 = Observable<Int>.interval(0.5, scheduler: MainScheduler.instance)
    .map { _ in ズンドコ(rawValue: arc4random_uniform(2))! }

_ = ズンドコ川
    .doOnNext { print($0) }
    .scan([]) { Array(($0 + [$1]).suffix(5)) }
    .takeWhile { $0 != [.ズン, .ズン, .ズン, .ズン, .ドコ] }
    .subscribeCompleted { print("キ・ヨ・シ!") }

実行例

0.5秒ごとに出力されるのでズンドコ感があり、結構ドキドキします。

ドコ
ズン
ズン
ドコ
ドコ
ズン
ドコ
ドコ
ズン
ズン
ズン
ズン
ドコ
キ・ヨ・シ!

リズム感を増す

今のままだとドコキ・ヨ・シ!が同時に出力されてしまい、少しリズム感に欠けます。takeWhileでストリームが終了したあとに

    .concat(Observable.never().take(0.5, scheduler: MainScheduler.instance))

みたいに0.5秒で終わるストリームをconcatすると、よりよいリズムになるでしょう。

Playgroundで実行するには

interval を動かし続けるために以下を追加してください。あと「RxSwift-iOS」ではなくて「RxSwift-OSX」のほうをビルドしておく必要があります。

import XCPlayground

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

他の言語の例

http://qiita.com/search?q=ズンドコキヨシ
http://qiita.com/shunsugai@github/items/971a15461de29563bf90

[追記] 改良してみた

より自己満足感を増した最終版を作りました。
ズンドコキヨシ with RxSwift 最終版と試行錯誤の歴史