Edited at

SwiftBondをver4.Xへ移行したときのメモ

More than 3 years have passed since last update.

以前"SwiftBondを使ってみての所感"という記事を書いたのですが、バージョンを4.0.0に、つまりSwift 2に対応したものにアップデートして実装しなおしたのでそのときのメモを書いておきます。

公式のドキュメントとしては以下に書かれています。

https://github.com/SwiftBond/Bond#migration

他のライブラリのSwift 2移行にともなうdiffとか全然みていないのでですが(Alamofireは自分が使う範囲内であればそれほど変更入れずに使えました)、


It's core has been rewritten from scratch and ...


とあるように(It'sは厳密にはItsかな??)、SwiftBondはかなり大幅なAPIの変更があります


DynamicObservable


Dynamic becomes Observable


とあるように

var someCount  = Dynamic<Int>(0)

var someCount  = Observable <Int>(0)

になります


DynamicArrayObservableArray

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)

そういえばどう書くんだろうと思って追記・・・