LoginSignup
47
45

More than 5 years have passed since last update.

ズンドコキヨシ with RxSwift

Last updated at Posted at 2016-03-12

元ネタ

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 最終版と試行錯誤の歴史

47
45
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
45