以前"SwiftBondを使ってみての所感"という記事を書いたのですが、バージョンを4.0.0
に、つまりSwift 2
に対応したものにアップデートして実装しなおしたのでそのときのメモを書いておきます。
公式のドキュメントとしては以下に書かれています。
他のライブラリのSwift 2
移行にともなうdiffとか全然みていないのでですが(Alamofire
は自分が使う範囲内であればそれほど変更入れずに使えました)、
It's core has been rewritten from scratch and ...
とあるように(It's
は厳密にはIts
かな??)、SwiftBond
はかなり大幅なAPIの変更があります
Dynamic
がObservable
に
Dynamic becomes Observable
とあるように
var someCount = Dynamic<Int>(0)
が
var someCount = Observable <Int>(0)
になります
DynamicArray
がObservableArray
に
var someList = DynamicArray<Some>([])
が
var someList = ObservableArray <Some>([])
になります。またメソッドも結構変わったので、利用するときは、ドキュメントがそれほどまだ整備されていないので、ObservableArray.swift
のファイルの中身みておくと良いかもです。
今回実際に修正したものは以下になります
self.list.removeAll(false)
self.list.append(list)
を
self.list.removeAll() // 引数がなくなった
self.list.extend(list) // 配列を足すときにappendがextendになった
に修正
プリフィックスがdyn
からbnd_
に
以前の記事にも書いたのですが、SwiftBond
ではUIKitのプロパティにバインディングするときにはdynText
のようにdyn
というプリフィックスがついたものを利用していたのですが、
group.name ->> cell.nameLabel.dynText
が
group.name.bindTo(cell.nameLabel.bnd_text)
になります
->>
よりもbindTo()
を推奨に
上の例がそのまま使えるのですが、->>
らのオペレータよりもbindTo()
メソッドを推奨する、とのことです。
UITableView
まわり
いろいろ複雑だったテーブルまわりの書き方が整理されたかなという印象。
これまでどう書いていたかは以前の記事にある通りなのですが、以下のような感じで書くことができるようになります
var list = ObservableArray<Some>([])
//...
self.list.lift().bindTo(self.someTableView) { (indexPath, array, tableView) -> UITableViewCell in
let cell = SomeTableViewCell()
let some = array[0][indexPath.row]
// バインディング処理を諸々書く
some.body.bindTo(cell.bodyLabel!.bnd_text)
return cell
}
ドキュメントとしてはこちらにあります
他
以前に記事でキューまわりの話を書いたのですが、作者さんから返事いただいた通り、
some.imageUrl
.deliverOn(Queue.Background).map { (urlString) -> UIImage in
// UIImageの取得処理はメインスレッド以外で行う
}.deliverOn(Queue.Main).bindTo(cell.avatarImageView.bnd_image)
こんな感じで書いて正しく動きました。感謝です。
内部の実装とかはまだ全然見れてないので、そちらもちゃんと見ておこうと思います
追記(2015/10/29) - 双方向バインディングについて
双方向バインディングは以下のように書く(これまで<->>
と書いてたもの)
self.someData.name.bidirectionalBindTo(self.hogeTextField.bnd_text)
そういえばどう書くんだろうと思って追記・・・