Swiftの変数の『?』や『!』の使い方と挙動、エラーの仕組み等がよくわかっていないのでちょっとだけ整理してみた。
検証内容
検証内容として下記を試してみた。
- クラスのメソッド呼び出し
- nilの代入
- nil代入後の挙動
『String』型変数
普通に宣言したstr01
は、当然のようにString
のメソッドであるuppercaseString
は呼び出せる。出力結果には、英小文字が英大文字となって変換表示されている。
しかし、言語仕様によってnil
が代入できないのでエラーとなる。
そもそもnil
が代入できないので、その後の挙動は省略。
『String?』型変数
『?』宣言したstr02
は、そのままではString
のメソッドであるuppercaseString
を呼び出せない。
uppercaseString
が無いと叱られる。
その対応として、?
を付けてみると、メソッドが呼び出せるようになった。
次に、『?』宣言したstr02
にnil
してみると、普通に代入できる。
その後の処理では、nil
に対してメソッドを実行するために当然エラーとなる。
『String!』型変数
『!』宣言したstr03
は、String
のメソッドであるuppercaseString
を呼び出せるようだ。
出力結果には英小文字が英大文字となって変換表示されている。
そして、宣言したstr03
にもnil
が代入できる。
その後、nil
を代入した後の処理でメソッドを呼び出しをするようになったら、先ほどまで呼び出せていたメソッドのポイントでエラーが発生するようになった。
よく理解できていないのであるが、これは、おそらくコンパイルは通るけど、ランタイムエラーとなるエラーパターンなのかもしれない。Java
でいうヌルポ?
この辺りの検証はまた別の機会に行いたいと思います。とりあえず今回は挙動の整理までに。
※注意事項としては、上記はPlayground上での挙動なので、実際の言語仕様通りに動作できているかは不明です。
※尚、上記はXcode6-β5
で検証しています。 Xcode6-β6
は2014/08/22現在不安定らしいので。
Lovely Swift!!