WWDC 2014でのスライド'Advanced Swift'に不動点コンビネータを使った見事な方法が載っていたので問題を簡潔にしてメモしておきます.情報をくれた@Ushio@githubさんに感謝. letだけでは無理 letを(letrecのように)使って let fib = {(n: Int) -> Int in return n < 2 ? n : fib(n - 1) + fib(n - 2) }
![Swiftのクロージャで再帰 - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/6ef0b8113a5a3ab627007ede02d8d73e3a530e76/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9U3dpZnQlRTMlODElQUUlRTMlODIlQUYlRTMlODMlQUQlRTMlODMlQkMlRTMlODIlQjglRTMlODMlQTMlRTMlODElQTclRTUlODYlOEQlRTUlQjglQjAmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtY2xpcD1lbGxpcHNpcyZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWIxZDRiMTM2MDBiMTA2ZTRkOTRiZGUwN2JiYWJkZDg2%26mark-x%3D142%26mark-y%3D112%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwc2F0b3NoaWEmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPTI5ZTdmNzhkYTVhYmM0M2M3NDJmNGQ0YWY1MDM2ZWMw%26blend-x%3D142%26blend-y%3D491%26blend-mode%3Dnormal%26s%3D1a5c411455f2263b992e6d24f40a3d5c)
循環参照するか、しないかの切り分け 循環参照するか、しないかの切り分けはエンジニアが考慮する必要があります。この切り分けはObjCと同様なので、ここでは詳細には触れません。 ちなみに、Xcode6 Beta5のSwiftではコンパイルワーニングで循環参照を知らせてくれません。とはいえ循環参照のコンパイルワーニングはObjCでも全部網羅されていないので、最終的にはエンジニアが考慮する必要があるのはかわらないのですが。 対象の変数をweakで対応し、実行時に変数がnilになる可能性の切り分け そもそも、実行時に循環参照する対象の変数がnilになる可能性で判断ではなく、対象の変数定義がOptional定義かどうかで判断できないか 常にOptional定義かどうかで判断できないのではと思っています。例えばselfはself!としてunwrapしてアクセスしないので、selfはOptionalではな
2015-06-28 Swiftのコツ - owned self と weak self Swift Swiftでブロック構文を使うとき、循環参照を避けるためよく [unowned self] とか [weak self] とかきます。 で、この2つの差について今回は解説します。 結論からいいますと、 迷う状況なら weak self です。 unowendのほうがパフォーマンス面は有利ですが、誤った使い方をするとクラッシュします。 weakのほうが安全なのです。 ためしに、こちらのTimerクラスを使った処理を書いて比較してみましょう (※見やすさの都合、引数のTimerは消してます) class Test { var count = 0 func main() { //printCount()を一定時間おきによびだす Timer.start(1, true) { self.print
Swiftではクロージャを関数ポインタに近い形で使えるため、UIViewのタッチイベントなどを簡単に外部に分離できます。 今回は私のお気に入りの方法で、タッチイベント4種類を外部から呼べるようにする例を挙げます。 (※2015-10-20: Swift1.2からSwift2.0に修正しました) UIView派生クラス タッチイベント用にev_touches_****という変数を4つ作成し、それぞれの初期化にクロージャを入れておきます。 クロージャ内の処理はからっぽにしておきます。こうするとクロージャを初期化で入れておけるので、各オブジェクトのnilチェックしなくても問題なく動作します。またSwiftの型推論が力を発揮します。関数ポインタのようにややこしい型定義をしなくてすむので楽チンです。 KNGView.swift import UIKit class KNGView : UIView
(thanks to id:koyachi、del.icio.us/rtk2106) OOPとFPと。関数、オブジェクト、クロージャの使い分けについて考えます。 関数型が良いのか、オブジェクト指向が良いのか、知りたいと思っていました。色々なページを読み、現時点で一応の答えを得ました。 カウンタを例にして、関数、スコープ、オブジェクト、クロージャの順に見て行きます。関数関数は処理です。入力と出力があります。関数型プログラミングでは、関数同士の入力と出力を連結しプログラムが構成されます。 var current = 0; function next(v){ return v + 1 } function previous(v){ return v - 1 } ok( 1 == ( current = next(current) ) ); ok( 2 == ( current = next(cu
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く