オープンデータとプログラミング

Swift|変数の最後にあるクエスチョンマークやビックリマークの意味は?

swift

オプショナルなデータ型

var hogehoge:String?

Swiftをはじめて、まずハマるのが変数の後ろについている”?”や”!”ではないでしょうか。

他の言語ではあまり見かけない仕様ですからね。

Swiftでは、データの定義や取り扱いにおいて”オプショナル”という付加的な情報をもたせることができます。

その”付加的な情報”っていったい何者なのか?というわけですが、それは

  • ”変数がnilの場合があるかも?”
  • ”予想しているデータ型と異なるかもしれない”

といった情報のことを指しています。

”文字列だがnilかもしれない”というデータ型は”String?”で表します。
整数型(Int)の場合も同様です。

  • オプショナル整数 Optional Int
  • オプショナル文字列 Optional String

冒頭の例でいうと、hogehogeはnilになる可能性があるので”?”をつけて定義しているわけです。

次の例では、2行目でnilを代入していますが、問題なく代入できます。

var hogehoge:String?
hogehoge = nil //問題なく代入できます

ところが、次の例では、2行目でエラーになります。

var hogehoge:String
hogehoge = nil //エラー

Swiftのデータ型は、デフォルトではnilを許容しないということを覚えておきましょう!

変数名の最後のビックリマークは箱を開けるイメージ

Swiftのソースコードをみていると変数名の最後にビックリマーク(!)ついてることがあります。
例えば以下のような感じです。

hako!

このビックリマーク(!)は、アップルのマニュアル『The Swift Programming Language』では
”Forced Unwrapping”と説明されています。”Forced Unwrapping”とは、直訳すれば”強制的に包装を解く、
あける”といった意味になるでしょう。

先のプログラムの例でいうと、変数hakoを開けて箱の中身をみるイメージになります。

”Forced Unwrapping”は日本語では”強制アンラッピング”と訳されます。

強制アンラッピングは、箱の中身によって振る舞いが異なります。

箱の中身が空(nil)だと爆発します。

これは冗談ですが、エラーになります。

Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
var hako:String?
hako = "宝物"
hako!		//宝物発見!→エラーは出ない
var hako:String?
hako = nil
hako!		//残念、箱の中身は空!! → エラー発生!

箱の中身が空の場合は、箱を開けないように注意しましょう!

Comments are closed.