post Image
PromiseKit 6 にアップデートしたらいろいろ変わってたメモ

PromiseKit6が出てた

https://github.com/mxcl/PromiseKit
https://promisekit.org/news/2018/02/PromiseKit-6.0-Released/

まだ絶賛PromiseKit4使用中だったので、バージョンを上げましょうという話になった。
ご丁寧に上記URLでPromiseKit4からの変更について書かれている。

本記事では、バージョンアップのmigrationの際に主に変更があった部分のメモだけ載せるので、詳しくは上記を参照してください。

何か間違いあればご指摘お願いします :bow:

initializerが変わったので対応する

今まで

Promise { fulfill, reject in
    if ... {
        fulfill(data)
    } else {
        reject(error)
    }
}

新しいやつ

Promise { resolver in
    if ... {
        resolver.fulfill(data)
    } else {
        resolver.reject(error)
    }
    // resolver.resolve(data, error) でもOK
}

resolver (公式ではseal) が引数として渡されるようになったのね。中身はそんなに変わってないけど、 resolver.resolve で一気に渡せるようにもなってる。

thenが3つに別れたので対応する

今までthenで一括りにされていたのが、次の3つに分解された。
元のthenは次の3つがあった。

then(execute: Results<U>) -> Promise<U>
then(execute: Results<U>) -> AnyPromise
then(execute: Results<U>) -> U

AnyPromiseは置いておくとして、thenひとつでPromiseを返すものとその値を返すものがあった。
また、多くの場合で何も値を返したくないこともあり、明示的に Promise<U> -> Void と書いてやることでコンパイルエラーを回避する、ということをやっていたりした。(私だけだったら悲しい)
これらをわかりやすくするために次の3つができたっぽい。

  • then
  • done
  • map

then (新しい方)

Promiseを受け取ってPromiseを返すときに使う。今までどおり。

somePromise.then { obj -> Promise<U> in
    doSomething(obj)
    return getSomePromise()
}.then ...

done

Promiseを受け取って何も返却値がないときに使う。だいたいこれを使うことが多い。

promise.done { obj in
    some(obj)
}

map

Promiseを受け取って中のvalueなどPromiseでない値を返すときに使う。

promise.map { obj -> U in
    value = some(obj) // valueは非Promise
    return value
}

その他の便利なやつ

他にも、上記の3つ+αなもののエイリアス的なメソッドが増えていた。

compactMap

mapのoptional unwrap付きバージョン。nilだとcatchに入る。

somePromise.compactMap { data in
    UIImage(data: data)
}.done { image in
    imageView.image = image
}.catch {
    ...
}

get

doneと同じで明示的にreturnしないが、与えられたものと同じ値を返す。

somePromise.get { data in
    setup1(data)
}.done { data in
    setup2(data)   
}

tap

値を Result<T> でラップした値を受け取る。catch使えばいいんじゃないかと思うけど、何か用途があるんだろうか。

alwaysなくなってensureになった

名前変わっただけ。

catchがPromiseを返さなくなった

地味にやっかいなやつ。
catchがPromiseを返さなくなったので、このあとに処理を続けられなくなった。
ensureもダメ。
しかしまぁ、エラーのあとにやりたい処理があるでしょ、という場合のために finally が追加された。

というわけで、catchのあとにはfinallyを使う。

somePromise.done { data in
    setData(data)
}.catch { e in
    handleError(e)
}.finally {
    finish()
}

Promiseを返すメソッドの最後がcatchになっていた場合ややこしい気がする。やってみて追記する。

新しい型 Guarantee<T> ができたので使えそうなら使っていく

failしないPromiseとしてGuarantee<T>ができた。
catchが書けなくなるので、エラーになることのない処理はこっちになる。わかりやすい例のはafter

after(seconds: 1.0).done {
    startAnimation()
} // .catchは書けない

エラー有り無しを制御しやすくて良い。UIKitのextensionにあった UIView.animate 系も Guarantee<Bool> を返すようになっている(下記参照)。

UIViewのアニメーション

UIKitのextensionも同様に更新されていて、例えばアニメーションの書き方が少し変わっている。
https://github.com/PromiseKit/UIKit

大きな違いは、Promise<Bool> ではなく Guarantee<Bool> を返すようになっている点。
catchを書けなくなったので良い。

今まで

UIView.promise(animateWithDuration: 0.2, animation: {
    someMove()
}).then { 
    ... 
}

新しい

UIView.animate(.promise, duration: 0.5, options: .curveLinear) {
    someMove()
}.then { _ -> Guarantee<Bool> in
    return UIView.animate(.promise, duration: 1.0, delay: 1.0, options: .curveEaseOut) {
        anotherMove()
    }
}.then {
    ...

調べる予定

時間切れなのでこのへんにしつつ、他にもなにかでてきたら調べて追記したい

例えば、
UIView.promiseにwarning消すために全部catch書くのが面倒 UIView.animate も変わってたので追記済み。


『 Swift 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。