HOME > 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-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... |
Tweet | |||
|