SwiftのcompletionとSQLのPreparedStatement
Swiftのcompletion
初めの頃、よく通信処理などのメソッドの引数の最後にcompletionやcompletionHandlerなどが与えられ、そのブロック内で通信処理の後に実行することやJSONのパースなどをしていました。
しかし、最初の頃はXcodeの補完のダブルクリック展開でなんとなーく終わったあとの処理をブロック内に書いておいて、引数のdataをパースしたり、errorを確認していました。
全くわかりませんでした。
ですよね?笑
まぁー、僕は理解はできていませんでした。
しかし最近クロージャに再挑戦したところわかってきましたので、メモ程度に。
色々ツッコミはあると思いますが、最初の僕みたいな人が見るとなんとなーくわかるかなと。(クロージャの書き方や詳しい性質は説明しませんので)
またタイトルはクロージャでもよかったのですが、クロージャは他にもいろいろな使い方があるのでこのようにいたしました。
そしてわかりやすいように通信中にエラーは起きないと仮定しております。 (responceはtypoです)
まずはクロージャを使わなかったもの
このように関数を2つ作らなければいけないですね。
コンソールはこんな感じです
「生成されたもの」という表現はおかしいですが、スクショ撮り直すの面倒なので、レスポンスだと思ってください
クロージャを使うと
クロージャの特性により変数に値を保持できるからですね。
こんな感じでクロージャの特性を使うことによりブロック内で終わったあとの処理が書け、可読性の向上に繋がるというわけです!!
今回は通信メソッドの実装もしましたが、メソッドを使用する側ですと、別で通信後の処理のメソッドを作るよりも、クロージャで書いたほうが見やすいし使いやすいですね。
ただまだまだクロージャを使いこなせていないのでこれからも精進していきます。
次は
SQLのPreparedStatement
これは最近インターンで開発させていただいているプロジェクトのコードを見て、SQL文に?が入っていてなんだこれ?と思ったので即ググりました。(?を見るとすぐにオプショナルと思ってしまう癖がついています...w)
これはPreparedStatementというものでした。
PreparedStatementとは?
準備済みSQL。バインド変数?のパラメータを持つSQL
たとえば
SELECT * FROM name WHERE id = ?
上記のようなSQL文を予め準備しておき、?の部分は実行時に展開させる
PreparedStatementはどのようなメリットがあるのか?
- SQLインジェクション対策
- 高速化・・・SQL文が事前にプリコンパイルされるため
※SQLインジェクションとは
データベースと連携したWebサイトで、データベースへの問い合わせや操作を行うプログラムにパラメータとしてSQL文の断片を与えることにより、データベースを改ざんしたり不正に情報を入手する攻撃
http://e-words.jp/w/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3.html
ちなみに最近のニュースでもありましたが、高校生がDos攻撃用ツールなどを保持している時代なので、今サービスやプロダクトを作っている人や今後作る人はセキュリティもしっかり考えて作らなければいけませんね。
僕はSQLインジェクション、Dos攻撃、DDos攻撃、CSRF、ポートスキャンぐらいしか知りませんが、これからセキュリティの知識も少しずつ頭に入れていきたいと思っています