LoginSignup
30
23

More than 5 years have passed since last update.

SwiftでKotlinのapplyっぽいものを使いたい

Posted at

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と書いているところは結構なキモさを醸し出していると思いますが。
※ちなみにthislet thisなため、構造体(struct)では使うことが出来ないっぽいです。。

After

addSubview(UILabel().apply { this in
    this.frame = CGRectMake(0, 0, 100, 100)
    this.text = "swift"
    this.textColor = UIColor.cyanColor()
})

スッキリした感。まぁselfUILabelを参照できたら良いのですが出来なかったので、thisとしちゃってますが。当然this inを無くして$0でもOKです。
スコープも制限されているので、名前空間を汚さないので良いのではないだろうか。

まとめ

extension便利だな。
apply使っていこうと思う。

使うと手放せなくなるSwift Extension集
iOSアプリの開発効率をあげるSwiftの便利Extension

30
23
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
23