ゆったりゲーム三昧

趣味についてなんでも書くブログ。ゲーム三昧って書いてるけどゲームだけではなく、趣味のプログラミングについてもツラツラ書いている。

オプショナル型を理解する。Swiftの「!」とか「?」って何なの?

もともとObjective-CiOSのアプリ開発をしていたが、開発メンバがSwiftで開発を行っていたため、自分もそろそろSwiftやるかー(遅)となった。
そこでオプショナル型という特別な機能が追加されていたので、備忘録的に書いておこうと思う。
簡単に言うと、整数型などの様々な型にnilを扱えるようにしたもの。

nilとは

「何もない」ということを能わす特別な値。

オプショナル型の定義

var <変数名>:<型名>? = nil

例:

var a:Int? = nil

上のように書くことで、この変数aには整数とnilが格納できる
また、このオプショナル型にいきなり整数を代入しても問題はない。
ちなみに、この「Int?」はオプショナル整数型と呼ばれ、「nilを取りうる整数型」という意味になる。

オプショナル型の計算
オプショナル型の計算はそのままでは計算できない

var a: Int? = 10
println(a + 1)

このように書くと、エラーが起きてしまう。
オプショナル型はnilを扱える変数のため、変数aにnilが入っている可能性を考慮しなければならない。
このように直感的に書いてしまうと、変数aにnilが入っている時に対応できません。アプリがクラッシュしてしまいます。
では、どうするのかというと。

println(a! + 1)

このように<変数名>!と書いてあげると、変数から値を取り出すことができます。「変数にはnilが入ってませんよ」と伝えることで、Swiftにエラーを出させないようにしているのです。

ただし、変数aにもしnilが入っていると、アプリがクラッシュしてしまいます。

「!」を省略した書き方

<変数名>!と書くことでオプショナル型から値を取り出すことを説明しましたが、これだと、使用するたびに<変数名>!と書かなくてはいけないので、少々面倒です。

例:

println(a! + 1)
println(a! / 10)
println(a! * 3)

これを省略する方法があります。

var <変数名>:<型名>!

と、定義してあげるとそのまま書くことができます。

例:

var message :String! = nil
message = "hello"
println(message)

このように定義することで、変数messageはnilを扱うことができ、「!」を省略することもできます。

オプショナルバインディング

「値がnilならfalse、それ以外ならtrueが返される」という制御構文です。
例:

var age:Int? = nil
if let x = age {
    println("年齢\(x)")
} else {
    println("不明")
}

上の例では、変数ageはnilですので、falseが返されます。

nil結合演算子

例:

var x:Int? 
let y = x ?? 100

これは、「??」という演算子を用いて、
変数xがnilなら100を代入し、変数xがnilでなければxを代入するというものになります。
オプショナル型は初期値にnilを格納するので、この場合変数xには100が代入されます。