#apply使いたい
SwiftとKotlin、両方書いているとたしかに似ていていい感じなのですが、
KotlinのapplyがSwiftに無いのがちょっと不便。
ちなみにKotlinのapplyはスコープ関数と呼ばれるもので、下記の投稿が詳しいです。
Kotlin スコープ関数 用途まとめ
まぁそこで、無いなら作ればいいじゃんってことで、イジイジしていたらそれっぽいのができたので晒してみます。
(当方Swift力が低いため、不適切なところがあるかもですがご了承ください)
Before
例えばこんなコード
let label = UILabel()
label.frame = CGRectMake(0, 0, 100, 100)
label.text = "swift"
label.textColor = UIColor.cyanColor()
addSubview(label)
別に悪くはないと思いますが、もうちょっとスッキリしたい
定義
protocol ApplyProtocol {}
extension ApplyProtocol {
func apply(closure: (this: Self) -> Void) -> Self {
closure(this: self)
return self
}
}
extension NSObject: ApplyProtocol {}
コードを見て頂ければ雰囲気でわかると思いますが、自身をクロージャーで返すapply
を定義し、
それをNSObject
で拡張することで大概のクラスはapply
を使うことが出来るようにしています。
this
と書いているところは結構なキモさを醸し出していると思いますが。
※ちなみにthis
はlet this
なため、構造体(struct)では使うことが出来ないっぽいです。。
After
addSubview(UILabel().apply { this in
this.frame = CGRectMake(0, 0, 100, 100)
this.text = "swift"
this.textColor = UIColor.cyanColor()
})
スッキリした感。まぁself
でUILabel
を参照できたら良いのですが出来なかったので、this
としちゃってますが。当然this in
を無くして$0
でもOKです。
スコープも制限されているので、名前空間を汚さないので良いのではないだろうか。
まとめ
extension便利だな。
apply使っていこうと思う。