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は何かを理解してみます。
やっと[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のバージ... |
Tweet
![]() |
|||
|