これが最後じゃないからね

iOS開発 / Swiftなどの技術を中心に

SwiftのcompletionとSQLのPreparedStatement

Swiftのcompletion

初めの頃、よく通信処理などのメソッドの引数の最後にcompletionやcompletionHandlerなどが与えられ、そのブロック内で通信処理の後に実行することやJSONのパースなどをしていました。

しかし、最初の頃はXcodeの補完のダブルクリック展開でなんとなーく終わったあとの処理をブロック内に書いておいて、引数のdataをパースしたり、errorを確認していました。

全くわかりませんでした。
ですよね?笑

まぁー、僕は理解はできていませんでした。

しかし最近クロージャに再挑戦したところわかってきましたので、メモ程度に。
色々ツッコミはあると思いますが、最初の僕みたいな人が見るとなんとなーくわかるかなと。(クロージャの書き方や詳しい性質は説明しませんので)

またタイトルはクロージャでもよかったのですが、クロージャは他にもいろいろな使い方があるのでこのようにいたしました。

そしてわかりやすいように通信中にエラーは起きないと仮定しております。 (responceはtypoです)

まずはクロージャを使わなかったもの f:id:haptaro:20160521195309j:plain

このように関数を2つ作らなければいけないですね。

f:id:haptaro:20160521195528j:plain

コンソールはこんな感じです
f:id:haptaro:20160521195609p:plain

「生成されたもの」という表現はおかしいですが、スクショ撮り直すの面倒なので、レスポンスだと思ってください

クロージャを使うと f:id:haptaro:20160521200844j:plain

クロージャの特性により変数に値を保持できるからですね。 f:id:haptaro:20160521195812j:plain

こんな感じでクロージャの特性を使うことによりブロック内で終わったあとの処理が書け、可読性の向上に繋がるというわけです!!
今回は通信メソッドの実装もしましたが、メソッドを使用する側ですと、別で通信後の処理のメソッドを作るよりも、クロージャで書いたほうが見やすいし使いやすいですね。
ただまだまだクロージャを使いこなせていないのでこれからも精進していきます。

次は

SQLのPreparedStatement

これは最近インターンで開発させていただいているプロジェクトのコードを見て、SQL文に?が入っていてなんだこれ?と思ったので即ググりました。(?を見るとすぐにオプショナルと思ってしまう癖がついています...w)

これはPreparedStatementというものでした。

PreparedStatementとは?
準備済みSQL。バインド変数?のパラメータを持つSQL

たとえば
SELECT * FROM name WHERE id = ?

上記のようなSQL文を予め準備しておき、?の部分は実行時に展開させる

PreparedStatementはどのようなメリットがあるのか?

ちなみに最近のニュースでもありましたが、高校生がDos攻撃ツールなどを保持している時代なので、今サービスやプロダクトを作っている人や今後作る人はセキュリティもしっかり考えて作らなければいけませんね。

www.nikkansports.com

僕はSQLインジェクションDos攻撃DDos攻撃CSRF、ポートスキャンぐらいしか知りませんが、これからセキュリティの知識も少しずつ頭に入れていきたいと思っています