自己紹介
じゅんじゅんと言うニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。
HAL大阪3回生です。(2017/06/02現在)
イベントや、勉強会に参加してるので是非お会いした際はお声掛けください!
RxSwiftとは
Reactive Programming in Swift
RxSwiftが何なのかみたいな人は多分5分で始めようと思ってないので説明は省きます。
実装していこう。
RxSwift in Swift4
今回の記事は今世の中のQiitaの記事とかがRxSwiftのバージョン自体が昔のものだったり、Swift3のものばかりなのでSwift4でプロジェクトつくるときどうしようかという時に読んでもらえればと思います。
環境
MacOS Sierra(10.12.6)
Swift version4
さてまずはpod installしようかな
今回使うのはRxSwift4.0.0のbeta.1を使います。
3.6.1を使うと、ビルドでエラーがでるためSwift4に合わせるためにベータ版を使います。
なのでPodfile
はこんな感じになります。
# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'
target 'rxswift-textfield-sample' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
# Pods for rxswift-textfield-sample
pod 'RxSwift', '4.0.0-beta.1'
pod 'RxCocoa', '4.0.0-beta.1'
end
さて今回はUITextField
とUILabel
をつなげようと思います。
UITextField
から受け取った文字列をUILabel
に書き込んでいきます。
ViewController.swift
はこんな感じになります。
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var input: UITextField!
let disposeBag = DisposeBag() //unsubscribeに必要なもの
override func viewDidLoad() {
super.viewDidLoad()
self.input.rx.text.orEmpty
.throttle(1.0, scheduler: MainScheduler.instance)
.distinctUntilChanged()
.subscribe(onNext: { [unowned self] text in
self.label.text = text
})
.disposed(by: self.disposeBag)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
まずUITextField
とUILabel
をoutlet
で接続します。(ここはコードで書きたい人はご自身で実装してください)
次にrx
です。これがRxSwiftから提供されているものになります。
今回は公式のREADMEの通り
rx.text.orEmpty
としてその後にthrottle
というオペレーターで1秒ごとに読みに行くようにします。
2017/10/12 追記:
throttleは「指定した時間は処理を行わない」ものです!理解不足でした。
今回は「指定した時間は処理を行わない」ことをしなくて良いのでいらないコードになります。
例として、何らかのAPIにデータを取得しに行くのに入力毎にアクセスしていたらとんでもないことになるなぁとか言う時に使うものだそうです!
その次によんでいるのはdistinctUntilChanged
ですね。distinct
と言うとSQLでもおなじみかと思います。重複を削除するものです!
そしてsubscribeでonNext
を取って処理を書いていきます。
今回はUILabel
に書き込みたいので書き込み処理を書いて終わりです。
onNext
以外にもerrorやcompleteなどありますが、optionalなので実装しなくても大丈夫です。
最後にunsubscribeするためにdisposedをよびます。
これだけで、UITextField
とUILabel
が繋がるんですね。最高すぎるんじゃぁないか!?
最後に
今回のソースコードはあげるほどでもないですが一応GitHubにリポジトリを作っています。
何故、ios初心者なのでなにか間違えているぞ!とかあれば教えていただきたいです!
Twitter @konojunya