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






