はじめに
こんにちはsuzukiです。本日で投稿が2回目となります。
今後ともよろしくお願い致します。
最近switch文でタプルを使用しているコードを読む機会があり、
タプルをswitchに渡す処理は自身で書いたことなかったため、備忘も兼ねてまとめました。
switch文にタプルを組み合わせて使うことで
ネストを浅くし条件分岐がわかりやすくすることができる点に魅力を感じております。
タプルとは
複数のデータを一つの組みにしてまとめたものです。
専用のクラスや構造体を定義するほどでもない場合によく使われます。
タプルのメリット
ArrayとDictionaryと比較すると型の制約が緩く感じます。
たとえばIntとStringとDataなど異なる型をそのまま扱うことができます。
タプルのデメリット
・要素の追加はできない
・mapやforeachなどの項目の操作ができない
使い方
下記の様にシンプルに記述ができます。
1 2 3 4 | //そのまま値だけで作成 let studentB = ("鈴木",1) //キーワードを追加も可能です。 let studentA = (name:"佐藤",classNum:2) |
戻り値として複数の値をまとめたい時などに便利です。
1 2 3 4 5 6 7 | func requestData()->(data:Data?,statusCode:Int,error:Error?){ var data:Data? var error:Error? var statusCode:Int = 200 //通信を行いそれぞれに値を代入 return(data,statusCode,error) } |
上記の場合だと通信結果のData?型とInt型とError?型をまとめて返却しています。
今回の記事ではrequestData()を元に呼び出し側でそれぞれ値の評価を行い、分岐の作成を行います。
タプルを使うswitch文について
それではrequestData()を元に今回使用させていただくswitchの評価について先に説明致します。
- ワイルドカード
値の評価をしないときは“_”を設定します。全部評価しない場合は必ずtrueです
case (_,_,_):
- オプショナルな値の評価nil以外
“let” (変数名+?)”の様に記述すると変数名にはUnWrapされた値が入ります。nilの場合はfalseです。
case let (data?,_,_):
- 範囲指定
数値型が設定されている場合は“200…300”の様な形で範囲の指定が可能です。
case (_,200...300,_):
テストコード
それでは上記を踏まえてrequestData()を通信結果としてハンドリングして見ます。
分岐内容はコメントを参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | switch requestData() { case let (data?,200,_): //通信成功パターン print(data) case let (_,_,error?): //通信失敗パターン print(error) case (_,300...400,_): //Redirection print("リダイレクション") case (_,400...500,_): //client print("クライアントエラー") default: print("該当なし") } |
通信のエラーハンドリングを細かく行う場合はこちらだけでは足りなくなるかも知れません。
後から変更を行う場合もif文に比べてswitch文の方が、分岐の追加はシンプルに可能です。
さいごに
最後まで有難うございます。
今回は実際に使われていた通信結果っぽいタプルを元に説明させて頂きました。
今回は細かな指定をする必要がなかったので触れていませんが、where節を利用することも可能です。
if文でネストが深くなったり、条件が複雑化して可読性が下がってしまっている時などに検討いただければと思います。