オプショナルなデータ型
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! //残念、箱の中身は空!! → エラー発生!
箱の中身が空の場合は、箱を開けないように注意しましょう!