読者です 読者をやめる 読者になる 読者になる

面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

Swiftの文字列にて、Implicitly Unwrapped Optional型の文字列を扱う際に失敗した話

Implicitly Unwrapped Optional型と呼ばれる下記のような記述を行うことで、 この変数を使う時にUnwrapしてくれるというのは大体の人は知っていると思う。

let hoge: String!

しかし、Unwrapしない時もあり、そのパターンに嵌ったので今後同じことがないように記録

パターン1:文字列に組み込んだ時 “hoge\(fuga)moga”

下記の場合、Unwrapされず、文字列にOptionalとまで入ってしまう。 hogeに対して!をつけてやればUnwrapされ、欲しい文字列になるだろうが、 Implicitly Unwrapped Optional型なのに、わざわざ!をつけてやる意味がわからない。 f:id:aryzae:20170502214215p:plain

結果、良いか悪いわからないが、下記記述方法に落ち着いた。 また、let hoge: Stringと、String型で定義してやっても、前者の方法でもなんら問題ない f:id:aryzae:20170502214219p:plain

パターン2:ローカル変数に入れた後、メソッドへ渡した時

先にやりたいことを提示しておく。 下記みたく引数にString型を取るメソッドにString!型を渡し、Unwrapして使うようにしたい f:id:aryzae:20170502215911p:plain

しかし、一度別の変数に入れた後、その変数をメソッドに渡すとForceUnwrapしなさいと怒られエラーになる f:id:aryzae:20170502215906p:plain

なぜなのか、型を確認したのが、下記となる。 最初String!型だったのに、変数に入れた際、 String型でもString!型でもなく、String?型になっている f:id:aryzae:20170502220105p:plain

理由

  • Swift3からImplicitly Unwrapped Optionalは、Optional型に付属するようになった
  • 型評価が必要な時だけUnwrapされる
  • それ以外はOptionalとして保持されている www.natashatherobot.com