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!!