[Swift]!や?ってなに? 分かりづらいオプショナル型についてのまとめ

swift

Swiftのコードを読んでいると「!」や「?」のような見慣れない文字が登場します。

これは、オプショナル型と呼ばれるもので少し分かりづらいものですが、大事な箇所なのでまとめて紹介します。

Swiftのオプショナル型とは?

Swiftでは変数や定数いはエラーが発生しないようにnilが代入できないような仕様になっています。

しかし、場合によってはnilを代入するケースも出てきます。その時に使われるのがオプショナル型と呼ばれるものです。

var num : Int
num = nil => Nil cannot be assigned to type 'Int'

上のコードではInt型の変数numにnilを代入してみました。すると、Nil cannot be assigned to type ‘Int'(nilを代入することはできません)とXcodeに怒られてしまいました。

もう一度、おさらいすると

Swiftでは変数や定数はエラーが発生しないようにnilが代入できないような仕様になっています。

「?」を記述し、nilを代入できるようにする

では、nilを代入したい時(または、代入せざるを得ないケースを想定)にはどのようにすればいいのでしょうか?

ここで登場するのが「?」です。(余談ですがSwiftのコードを勉強し始めてサンプルコードに「?」が登場した時、文字通り「?」となりました)

簡単に言うと型の後ろに「?」を付けることでnilを代入することができるようになります。これによりXcodeのエラーも解消されます。

var num : Int?
num = nil => OK!

オプショナル型にnil以外を代入する

変数や定数にnilを代入することができました。めでたしめでたし。

と終わればいいのですが、今度はオプショナル型を使ったことで弊害が生まれました。

それはnil以外を代入した時に値をそのまま使えないという問題です。ちょっとよく分からないので、先ほどの例でnil以外を代入してみます。

var num: Int?
num = 5
print(num) => Optional(5)

// オプショナルを使わない場合
var num5: Int
num5 = 5
print(num5) => 5

オプショナル型によりnilを代入できるようになったものの、nil以外を代入するとOptional型で出力されるようになりました。Xcode上でも注意されます。

これは、Int型の5がOptional(5)のようにラップされている状態です。

例えば、Int型の空の配列にこの変数を追加したいとします。この時に、中身はInt型なのですが外身はOptional型に包まれている(ラップされている)ので、エラーで弾かれてしまいます。

var num: Int?
num = 5

// Int型の空の入れる
var testArray = [Int]()

testArray.append(num) // Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?

エラー文ではアンラップされていませんと怒られていますね。nilを代入するためにオプショナル型を使ったのに次の問題が出てきました。

さあ、どうしましょうか。(Xcodeのエラー文を見るとアンラップするとエラーが解消されそうです)

「!」でオプショナル型を強制アンラップする

そして、ここで登場してくるのが今度は「!」です。

「!」の意味はOptinal型のラップを取り除く意味となります。

アンラップするときは変数(定数)の後ろに「!」を付けます。先ほどの例でアンラップを試してみてエラーを取り除いてみましょう。

var num: Int?
num = 5

// Int型の空の入れる
var testArray = [Int]()

// アンラップをする
testArray.append(num!)

これでOptional型に包まれていた変数はInt型で配列に追加することができました。

まとめ

Swiftの!や?について紹介しました。

  • Swiftでnilは代入できないので、オプショナル型(?)を使う
  • オプショナル型を使いアンラップする時には!を使う

こうやって見ると、?や!はセットで覚えることができますね。



カテゴリー