【Swift】ワイルドカードの使い方。使わない変数をアンダースコアでスッキリさせる。(Swift 2.1、XCode 7.2)
ワイルドカードとは
ワイルドカードとは、宣言する必要はあるが実際は使わない変数に用いられる省略記法のことである。記法は単純で、変数名を「_(アンダースコア)」にするだけである。
例えば、以下のコードは関数を呼び出した戻り値をワイルドカードの変数に代入する例である。関数は引数×2を計算して画面に出力したあとに計算結果を呼び元に返すが、呼び元では計算結果を使わないのでワイルドカードの変数に代入した。
しかし、この例では単純に「var _」を書かなければいい話なのであまり有効ではない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* ** 関数の戻り値をワイルドカードに代入する。 */ func calcNumber(data:Int) -> Int { let resultNum = data * 2 print("\(data)×2=\(resultNum)です。") return resultNum } var _ = calcNumber(5) //実行結果 //5×2=10です。 |
ちなみに、ワイルドカードは変数ではないので、ワイルドカードの値を取得しようとするとエラーになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* ** ワイルドカードの値を取得しようとするとエラーになる。 */ func getMessage() -> String { return "テストメッセージ" } var _ = getMessage() print(_) //コンパイルエラー //error: '_' can only appear in a pattern or on the left side of an assignment |
ワイルドカードの使いどころ
どんなときに使えるだろうか。例えば、以下のコードのように関数の戻り値がタプルで、その後の処理で使うのがタプルの中の限られたものの場合、使わないものをワイルドカードにしてしまえば、コードがスッキリして見やすくなる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* ** タプルの戻り値で使わないものをワイルドカードに代入する。 */ func calcTax(data:Int) -> (Int,Int,Int) { let resultNum = (data * 2, data * 3, data * 4) return resultNum } var (_, test, _) = calcTax(5) print(test) //実行結果 //15です。 |
for-in文を使ってループをするときに、処理の中でループカウンタの値を使わない場合はワイルドカードに代入してもスッキリする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* ** for-in文のループカウンタにワイルドカードを利用する。 */ func printMessage(name:String) { for _ in 1...3 { print("リラックス\(name)さん") } } printMessage("奥田") //実行結果 //リラックス奥田さん //リラックス奥田さん //リラックス奥田さん |
クロージャの変数を使いまわすときに、処理ごとに必要な引数が異なる場合がある。そんなときは、以下のコードのように必要の無い引数をワイルドカードにしてしまえばスッキリする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/* ** クロージャの引数にワイルドカードを利用する。 */ //クロージャの変数を宣言 var test:(Int, Int) -> Int //クロージャ1 test = {(price, _) in price * 10 } print(test(100,3)) //クロージャ2 test = {(_, number) in number * 20 } print(test(100,3)) //実行結果 //1000 //60 |
関数の引数にワイルドカードを使うこともできる。以下のコードのように、第2と第3引数をワイルドカードで宣言すれば、呼び出す側は決められた型と個数を引数に与える必要があるが、関数内部で使えるのは第1引数のみになる。
そもそも、引数の定義自体を削除したほうがスッキリすると思うが、プロトコルを適用したクラスを作るときやメソッドのオーバーライドなどで引数を削除できないときに利用することになりそうだ。なお、プロトコルやオーバーライドに関しては本サイトではまだ説明してないので、今後の記事で説明する。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* ** 関数の引数にワイルドカードを利用する。 */ func printPrice(price:Int, _:Int, _:String){ print("\(price)円です。") } printPrice(100, 50, "サトウのごはん") //実行結果 //100円です。 |