Swiftの文字列にて、Implicitly Unwrapped Optional型の文字列を扱う際に失敗した話
Implicitly Unwrapped Optional型と呼ばれる下記のような記述を行うことで、 この変数を使う時にUnwrapしてくれるというのは大体の人は知っていると思う。
let hoge: String!
しかし、Unwrapしない時もあり、そのパターンに嵌ったので今後同じことがないように記録
パターン1:文字列に組み込んだ時 “hoge\(fuga)moga”
下記の場合、Unwrapされず、文字列にOptionalとまで入ってしまう。
hogeに対して!
をつけてやればUnwrapされ、欲しい文字列になるだろうが、
Implicitly Unwrapped Optional型なのに、わざわざ!
をつけてやる意味がわからない。
結果、良いか悪いわからないが、下記記述方法に落ち着いた。
また、let hoge: String
と、String
型で定義してやっても、前者の方法でもなんら問題ない
パターン2:ローカル変数に入れた後、メソッドへ渡した時
先にやりたいことを提示しておく。
下記みたく引数にString
型を取るメソッドにString!
型を渡し、Unwrapして使うようにしたい
しかし、一度別の変数に入れた後、その変数をメソッドに渡すとForceUnwrapしなさいと怒られエラーになる
なぜなのか、型を確認したのが、下記となる。
最初String!
型だったのに、変数に入れた際、
String
型でもString!
型でもなく、String?
型になっている
理由
- Swift3からImplicitly Unwrapped Optionalは、Optional型に付属するようになった
- 型評価が必要な時だけUnwrapされる
- それ以外はOptionalとして保持されている www.natashatherobot.com