Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

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

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は「関数の内部で引数にセットした別の関数をつかう」と理解しておこうと思います。中途半端な 記事になって失礼しました。

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

アイコン一括作成サービス紹介

アプリのアイコンを作るのは手間で面倒くさい。と、思いながらPhotoshopで一つ一つサイズを変えて作っていたのですが、 簡単につくれるサービスやっぱりありました。Macのスクリプトだったり、Webサービスだったりと揃っていましたので共有します。

URLエンコードとデコード

サーバとデータのやりとりをしているとURLエンコードしないと文字化けしちゃったりと問題がでる場合があります。 phpのurlencodeやurldecodeと連携させる場合等、Swift側でどうやってエンコードすれば良いかの方法を記載しております

アップルWatchから親アプリケーションへデータ送信

前回の記事では実機上で親アプリケーションからAppleWatchにイベントを送るのができなかった。 Notificationでできるはずなのですが、動作してくれなかった、、、、、。今回はいったん逆の時計から親アプリへのデータ送信の方法サンプルサイト をQiita様の中の記事でみつけましたので検証してみます。
このエントリーをはてなブックマークに追加
右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!