2
2

More than 5 years have passed since last update.

Swiftの変数の『?』や『!』の使い方と挙動の整理

Last updated at Posted at 2014-08-24

Swiftの変数の『?』や『!』の使い方と挙動、エラーの仕組み等がよくわかっていないのでちょっとだけ整理してみた。

検証内容

検証内容として下記を試してみた。

  1. クラスのメソッド呼び出し
  2. nilの代入
  3. nil代入後の挙動

『String』型変数

普通に宣言したstr01は、当然のようにStringのメソッドであるuppercaseStringは呼び出せる。出力結果には、英小文字が英大文字となって変換表示されている。

しかし、言語仕様によってnilが代入できないのでエラーとなる。
そもそもnilが代入できないので、その後の挙動は省略。

スクリーンショット 2014-08-24 10.30.38.png

『String?』型変数

『?』宣言したstr02は、そのままではStringのメソッドであるuppercaseStringを呼び出せない。
uppercaseStringが無いと叱られる。

スクリーンショット 2014-08-24 10.33.24.png

その対応として、?を付けてみると、メソッドが呼び出せるようになった。

スクリーンショット 2014-08-24 10.34.25.png

次に、『?』宣言したstr02nilしてみると、普通に代入できる。
その後の処理では、nilに対してメソッドを実行するために当然エラーとなる。

スクリーンショット 2014-08-24 11.04.55.png

『String!』型変数

『!』宣言したstr03は、StringのメソッドであるuppercaseStringを呼び出せるようだ。
出力結果には英小文字が英大文字となって変換表示されている。

スクリーンショット 2014-08-24 11.10.27.png

そして、宣言したstr03にもnilが代入できる。

スクリーンショット 2014-08-24 11.11.40.png

その後、nilを代入した後の処理でメソッドを呼び出しをするようになったら、先ほどまで呼び出せていたメソッドのポイントでエラーが発生するようになった。

よく理解できていないのであるが、これは、おそらくコンパイルは通るけど、ランタイムエラーとなるエラーパターンなのかもしれない。Javaでいうヌルポ?

スクリーンショット 2014-08-24 11.12.18.png

この辺りの検証はまた別の機会に行いたいと思います。とりあえず今回は挙動の整理までに。

※注意事項としては、上記はPlayground上での挙動なので、実際の言語仕様通りに動作できているかは不明です。
※尚、上記はXcode6-β5で検証しています。 Xcode6-β6は2014/08/22現在不安定らしいので。

Lovely Swift!!

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2