読者です 読者をやめる 読者になる 読者になる

Swift:クライアントからサーバにデータを投げるために、JSONSerializationを利用しよう!

最近NSKeyedAchiverクラスとかachivedDataメソッドとか

色々使い方を勉強していたが、

元々やりたかったのは、

「クライアントからサーバにJSON形式の文字列を送信すること」

「サーバからクライアントにJSON形式の文字列を送信すること」

をやりたかったんだよね!!

 

そのために課題を分解して色々勉強していたが、

ちょっと解決の兆しが見えてきた!

 

まず、

f:id:engineermasaru:20170419121955p:plain

というコードを説明しよう。

 

1行目

ディクショナリ型でdictという変数を定義。

(ディクショナリ:キーと値の組み合わせ)

 

2行目

Data型のjsonDataという変数を定義。

JSONSerializationクラスのdataメソッド(ラベル付き)を利用する。

withJSONObjectというラベルとシリアライズしたい変数dictを引数として与える。

 

ここまでで通信ができる状態にはなった!

 

3行目以降は、swiftでのデバック用。

3行目は、

String型のjsonStringという変数が左辺。

右辺から、代入するのは、Stringクラス。

Stringクラスに引数として、

dataラベル:jsonData変数、encodingラベル:.utf8で符号化してねーってこと

String - Swift Standard Library | Apple Developer Documentation

 

それを4行目でprintすると、こんな結果が出力される。

f:id:engineermasaru:20170419121958p:plain

おー!

 

2行目の後に、Alamofireを利用すれば

サーバにデータを投げれるのではないか?

という仮説はまた次回以降で

検証していきたいと思います。

Swift:NSKeyedArchiver.archivedDataメソッドの使い方

昨日NSKeyedArchiver.archivedDataメソッドについて触れたと思う。

その引数がよくわからないので

teratailで質問すると、こんな答えが返ってきた!

 

f:id:engineermasaru:20170419091611p:plain

ほうほう。

 

argument labelってのがあるのね。

ということでまたgoogle先生に尋ねると

Swift で関数一つ呼ぶのに苦労した話し - Qiita

という記事があり、

swiftの関数には、大きく4種類存在するらしい。

1:ラベルなし、引数1つ

2:ラベルなし、引数2つ以上

3:ラベルあり、引数1つ

4:ラベルあり、引数2つ以上

 

それぞれ関数に対して引数の与え方が

異なるところがハマるポイント!

 

で、今回のNSKeydArchiver.archivedDataメソッドは、

withRootObjectというラベルと、

シリアライズ(オブジェクト ー> バイナリ)したい

変数objを引数部分に記述するとうまく動作するようだ。

Alamofireを使いこなすために基礎を勉強していくの巻

Alamofireの使い方がわからなかったんで、

teratailを使わせてもらって質問したら回答が返ってきた!

Swift - alamofire4を使ったクライアントからサーバへの通信のコードの書き方がわかりません。(71872)|teratail

 

 

f:id:engineermasaru:20170418231716p:plain

という回答が返ってきたが、

ちょっと知識不足ですぐには理解できなかった。

 

まず、

let json= 〜と書いてある行はディクショナリというもの。

キーと値で成立している。

ディクショナリ | Swift言語を学ぶ

 

次にlet data =〜

と書いてある行は、

NSKeyedArchiverクラスのarchivedDataというメソッドを利用して、

引数jsonをdata型にシリアライズしている。

NSKeyedArchiverクラス - Cocoa API解説(macOS/iOS)

 

swiftにおけるdata型とは、Objective-cにおけるNSData型のこと。

バイナリデータを扱う時に利用する型のようだ。

NSData - iPhoneアプリ開発の虎の巻

(通信するときは、

JSON形式で送信すれば楽だけど、

バイナリデータで送ったほうが処理速度は早いよ

ってエンジニアの先輩が言ってた。そりゃそうだわ。)

 

シリアライズとは、

オブジェクトをバイナリに変換すること

(ちなみに、バイナリからオブジェクトに変換することは、

シリアライズという)

iOS でオブジェクトをシリアライズしてファイルに保存する方法 - A Day In The Life

 

で、今つまづいてるのは、

archivedDataというメソッドにはどんな引数を

与えればいいのか?ということ

class func archivedData(withRootObject rootObject: Any) -> Data

Swift逆引きハンドブック Swift 3.0 対応

って書いてあるから

なんでもOKってことかな??

 

SwiftのAnyObjectとAnyの違い - Qiita

Anyは、関数型を含むすべての型のインスタンス

Anyobjectは、クラス型のインスタンス

なのでAnyのほうが汎用性は高いようだ。

 

[Swift]AnyObjectとAnyと総称型(T)の違いをメモったよ! - Qiita

おおお!この辺で総称型の説明にも関連付けができるが、

Alamofireを使う上では関係ないので、いったん勉強は保留。

目的はコード書いて、つくることだ!

また総称型を勉強する機会は訪れるだろう。

swift: !と?って色々出てくるけどさぁ。。

結局、?と!ってなんやねん!?

 

ってことでここを参照。

どこよりも分かりやすいSwiftの"?"と"!" - Qiita

めちゃくちゃ丁寧に解説してくれている。

丁寧がゆえに少し長いので時間が必要。

 

今までコンパイラによって導かれるままに、

?とか!を利用してきたけど、意味が理解できましたよ涙

 

swift:プロトコル、デリゲート、optional funcってなんだ?

相変わらず、alamofire4のHTTP通信でつまづいていますが、

根気強く調べて解決していこうと思います。

 

まずは、

Alamofire.uploadを使えばPOST通信ができるらしい。

Alamofire/Alamofire 4.0 Migration Guide.md at master · Alamofire/Alamofire · GitHub

(サイト内をpostで検索)

 

ということでswiftコードを書いてみると、

コンパイルエラー発生。

cannot invoke'upload' with an argument list of type 〜

ってやつで何言ってんだ。。。

ということでコンパイルエラー集を見てみたら、

どうやらこの引数じゃ関数を呼び出せねーよと言われている。

f:id:engineermasaru:20170409164921p:plain

 

Swiftのコンパイルエラー寄せ集め

ほうほう。

 

じゃあ「uploadってどんな引数があればいいの?」

ということで、エラーコードが出ているuploadに

マウスポインタを持っていって、

command+クリックでupload関数に飛びました。

f:id:engineermasaru:20170409164926p:plain

 

そしたらTaskConvertible?ってのがよくわからん。

ってことで、また

マウスポインタを持っていって、

command+クリックでTaskConvertible?にジャンプ。

 

するとこんな画面が。

f:id:engineermasaru:20170409165117p:plain

TaskConvertibleってプロトコルなのね。

 

。。。

 

プロトコルって何?

【Swift】プロトコルの使い方。クラスに実装しなけれならないプロパティ、メソッドを指定する。 | はじはじアプリ体験記

プロトコルとは、

クラスに実装するプロパティやメソッドを指定できる機能のこと。

 

じゃあ.swiftファイルの1番上に出てくる青いこれも

プロトコルなのね!!

f:id:engineermasaru:20170409165352p:plain

 

となるとUIPickerViewDelegateという名前のプロトコルに、

PickerViewを使う時のプロパティかメソッドが指定されてんのね!

 

f:id:engineermasaru:20170409165615p:plain

あれー?プロトコルで指定されているのに、

全部のメソッドを利用していないよねと気がついた。

 

optionalってのがついているのが理由か!?

ということでoptionalを調べる。

Swift におけるオプショナルなメソッドについて真面目に考える – NET BIZ DIV. TECH BLOG

やはり、実装必須のメソッドと実装しなくてもいいメソッドが

存在するらしいね。

今回の例でいうと、すべてがoptionalなメソッドなので、

実装しているメソッドと実装していないメソッドがあっても

正常に動作してくれるというわけなのか。

alamofireの通信ではまった汗

今日の学び:

ライブラリのバージョンによって仕様が異なる場合あり。

ネットに出回っている情報もいいが、

developerサイトを直接見たほうが情報の鮮度が高い。

 

何があったのか?:

alamofire.requestメソッドを利用すると、

HTTPリクエストをwebサーバに送ることができる。

 

ところが、このリンクに書かれた記述では、

「Extra augument in call」というコンパイルエラーが発生

[Swift] HTTP通信OSS Alamofire 導入編 | Developers.IO

 

何を言っているエラーなのかわからんからまた調べる

Swiftのコンパイルエラー寄せ集め

ほう、どうやら

Extra augument in callは、

引数が多いよーって言っているらしい。

 

ってことは、

そもそもどんな引数記述をすればいいのー?

ということで、alamofireのgithubを見る。

Alamofire/Alamofire 4.0 Migration Guide.md at master · Alamofire/Alamofire · GitHub

 

下の画像を見ると、alamofireのバージョンによって、

引数の仕様が変わっちゃったらしい!!

f:id:engineermasaru:20170406010716p:plain

 

ということで、

alamofire3の書き方でなく、

alamofire4の書き方にすれば、

エラーが消えて、Runできるようになりましたとさ。

 

めでたしめでたし!

グラフ作成ライブラリをつかってみよう!

今作っているアプリで、

折れ線グラフを利用したいなーって思ったので、

以下のサイトで学習〜〜

【Swift】Chartsを使って色々なグラフを描画してみる - しめ鯖日記

[Swift] [iOS] チャート表示ライブラリ [ios-charts] - Qiita