↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

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

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-05-14 14:21:41

WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

2021-05-06 14:04:37

LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

2021-05-01 18:05:35

久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!