KotlinがGoogleさんに認められた(?)ので、Kotlinを勉強し直さないとと思い、記事を読んでいたらletという機能があると...
結構便利そうなのでSwiftでもできないかなーと
読んでた記事
↓↓↓↓↓↓↓
JavaプログラマがKotlinで便利だと感じること
Kotlinのlet
例
たとえば、数を足すだけのメソッドfoo
がありますよと
そのfoo
を複数回使う計算とかでてきますよね...
(foo(1, 2) + 6) / foo(1, 2) // 3
こんな感じ
どっちのfoo
も引数が同じなので、返り値も同じですね
そうなると無駄ではw(foo
がもっと重い処理になったら複数回も呼びたくないとw
とりあえずの解決策
val f = foo(1, 2)
(f + 6) / f // 3
とりあえず、foo
は1回しか呼ばなくてすみましたね
でも、2行になってしまったよ...(細かいですがw
そこでlet様
foo(1, 2).let { f -> (f + 6) / f }
1行だし、1回しかfoo
呼んでないしいい感じ
とりあえず、letの実装を...
inline fun <T, R> T.let(block: (T) -> R): R = block(this)
呼び出し元をClosureにいれるのか!ふむふむ
Swiftでやっちゃおう
まず、名前がかぶるのでlet
が使えない(みなさんご存知、変数宣言時のlet
がありますねw
なので、lets
にしました(let_swift
の略みたいな感じです
とりあえず、実装を!
// プロトコルを定義
protocol Lets {}
// プロトコルにメソッドを追加
extension Lets {
func lets<R>(_ closure: (Self) -> R) -> R {
return closure(self)
}
}
// プロトコルを拡張したいクラスに
extension Int: Lets {}
プロトコルとして定義して、そのプロトコルでクラス(今回はInt
)を拡張します
使い方は、この通り簡単です
foo(1, 2).lets({
($0 + 6) / $0
}) // 3
改善できなかった点
Swiftに全ての元になるクラスがみつからなかったため、使うクラスに随時拡張していかなくてはならなそうでした....
追記
演算子を使用して...と、コメントでいただきましたので、みなさんのお役に立てればと!
=>
演算子を使用しています
foo(1, 2) => {
($0 + 6) / $0
}
詳細はこちらのGitHubにあります。
まとめ
今回紹介したクラス拡張の仕方は、きっとどこかで役に立つと思うのでぜひぜひ覚えてください。
今回はInt
クラスに拡張しましたが、他のクラスでもできますのでみなさんもお試しください
GitHub Gist
参考
SwiftでKotlinのapplyっぽいものを使いたい
(こちらで紹介されているapply
も役に立つ、使いやすいので是非お試しください)