Edited at

[Swift] firebase ってこうやったら気持ちいいのでは?

More than 1 year has passed since last update.

ついさっき触り始めたばかりだけど、observeがごちゃごちゃして読みにくくなるので考えてみた。

import FirebaseDatabase

protocol DataBuilder {

associatedtype Output

func build(snapshot: DataSnapshot) -> Output?
}

extension DatabaseQuery {

func observe<B: DataBuilder>(_ type: DataEventType, builder: B, with handler: @escaping (B.Output) -> Void) -> DatabaseHandle {

return observe(type) { builder.build(snapshot: $0).map(handler) }
}
}

これで、例えばこう。


struct StringBuilder: DataBuilder {

func build(snapshot: DataSnapshot) -> String? {

return snapshot.value as? String
}
}

すると、すっきりする。


override func viewDidLoad() {

db = Database.database().reference()

handler = db.child("child").observe(DataEventType.value, builder: StringBuilder(), queue: .main) { string in

self.field.stringValue = string
}
}

追記:

実践的にするにはDataBuilder#build(snapshot:)を throwsに変えて handler を (B.Output, Error) -> Void とするかResultを導入して (Result<B.Output>) -> Voidとするのがいいと思います。