【新サービス告知】いつでもどこでもイベントを開催できる。スマホのWebカメラを利用したVRイベントスペースサービス(Meetatcube.com)
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > Autoclosureの良さを見つけ出す

Autoclosureの良さを見つけ出す

先日のLiteral(__FILE__等)の処理を調べている際にautoclosureの表記があったの で改めて調査してみます。呼び出し側でClosureと使える、、、、ようですが、はて、、、よくわかっていない。

参考:autoclosureというマニアックで少し面白い機能
参考:How to use Swift @autoclosure
参考:Swift: The difference between a closure and an @autoclosure (Xcode 6 GM)

やってみた

実際処理をみてみましょう。


testAutoClosure(123)

func testAutoClosure(@autoclosure closure: () -> Int) {
    closure() //123
}


他の例もみてみましょう


class ViewController: UIViewController {
    
    override func viewDidLoad() {
        
        //closure無し
        f({2 > 1});
        f(2 > 1);
        
        //autoclosure有り
        f_autoclosure({2 > 1});
        f_autoclosure(2 > 1);
    }
    
    func f(pred: () -> Bool) {
        if pred() {
            print("hogehoge~")
        }
    }
    func f_autoclosure(@autoclosure pred: () -> Bool) {
        if pred() {
            print("hogehoge")
        }
    }
}

上の場合、どこでコンパイルエラーがでると思いますか?

サンプル画像

この行でエラーが発生します。つまり、autoclosureをつけた場合、関数({2>1})が関数(2>1)になってラップが不要になりました。 とここまで描いて、え、、、それだけ?と感じました。



うーん、何が得なのかよくわかりません。。。改めて調べてみると、 引数の関数処理をクロージャーとして利用できますと書かれていますが、まずクロージャって何? なので、クロージャーの定義も調べてみます。


参考:クロージャってどんなときに使うの? ~ 利用場面を 3つ 挙げてみる
参考:私が今までクロージャを理解できなかった理由

以下の様な場合、クロージャは力を発揮するらしい、、、、(まだ分かっていません)

  • グローバル変数の数を減らしたい! <- 関数の中に変数をかけるので同じ名前をつかえる?
  • カスタマイズしやすい関数を作りたい! <- わかるようでわかっていません
  • 変数の値を保持して次の関数利用に使える! <- わかるようでわかっていません、、、

最初のグローバル変数の数を減らしたい! <- 関数の中に変数をかけるので同じ名前をつかえる? を検証してautoclosureの良さを実感するところまで進めてみます!


サンプルを読んでいましたが、まだよくわかっていません、、、まずClosureは何かを理解してみます。

参考:[Swift] Closureの書き方いろいろ

やっと[Closure]で腑に落ちるサンプルがみつかりましたので以下紹介いたします。


class ViewController: UIViewController {
    
    
    override func viewDidLoad() {
        
        let addTen = addNumber(10)
        addTen()//10
        addTen()//20
        addTen()//30
        let addSeven = addNumber(7)
        addSeven()// 7
        addSeven()// 14
        addSeven()// 21
    }
    
    func addNumber(number: Int) -> () -> Int {
        var sum = 0
        func add() -> Int {
            sum += number
            return sum
        }
        return add
    }
}

このサンプルは私の中では分かりやすかったです。変数を宣言する箇所に関数addNumberをつけて、 その中で引数を持ち増やしていくので、柔軟にaddNumberの引数を変更することもできるし、 変数宣言の節約にもなる。sum=0が何度も呼ばれていそうな気がしますが、最初の宣言時だけで その後は呼び出す毎にインクリメントしていきます。

やってみた

さて[Closure]がしっくりきたので、[autoclosure]を改めて見直します。-> 冒頭の{}が無くなる利点しかわからず。。。

まとめ

さてautoclosureを調査したつもりが、closureの調査記事になってしまいました。autoclosureは 正直そこまで利点がわからずautoclosureは「関数の内部で引数にセットした別の関数をつかう」と理解しておこうと思います。中途半端な 記事になって失礼しました。

↓こんな記事もありますよ!


2021-04-22 14:54:53

かっこいいカルーセル厳選3点!WebGLを使った渋い画像スライダー。

昨日カッコいいスライダーを探す旅にでていました。 よく使われるswiper など、シンプルで使いやすくデザインも良いのですが、何かもの足りない、、、。 そこで調べていくと、webglを使...

2021-04-20 14:46:43

Twillioとは何??skywayとは何が違うのか。webrtcを使う際に判断する情報。

先日webrtc開発で「twillio」といった名前を聞きました。 以前自分でskywayを使ってwebrtcを試していた際に調べた時には、無かったような気もするんだけと、KDDIが絡んでいる...

2021-04-19 13:58:21

先日久々にアップデートした妊娠週刊パパのAndroid版も。アカウント移管したいんだけど、注文ID見当たらないよ。

先日の妊娠、出産、育児関連のアプリ「妊娠週刊パパ」をAndroid studioで再リリースしようと思ってるんだけど、コンパイル失敗してエミュレータで動かせない。 多分sdkとかapiのバージ...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!