from Minority

〜log

言語仕様 [optional]

変数とnil,Optional型

  • nil
  • Optionalの省略記述を覚える前に、以下のフローで覚える



Optional型の宣言と初期化

  • 宣言
var optionalStr: Optional<String>
  • 初期化
var optionalStr: Optional<Int> = 255



Optional型のアンラップ

まず、宣言してメソッド呼び出してみる

var optionalStr: Optional<String> = "Swift"
optionalStr.lowercaseString //コンパイルエラー
  • Forced Unwrapping(強制アンラップ)
var optionalStr: Optional<String> = "Swift"

// アンラップして変数に代入
var unwrappedStr: String = optionalStr!
unwrappedStr.lowercaseString //swift

// アンラップしてそのまま利用
optionalStr!.lowercaseString //swift
  • nilチェックして利用
if optionalStr != nil {
    optionalStr!.lowercaseString
}
  • Optional Binding(チェック&アンラップ)
var optionaStr: Optional<String> = "Swift"
if let unwrappedStr = optionalStr {
    unwrappedStr.lowercaseString //swift
}
  • Optional Chaining(型メソッドを利用目的のアンラップ)
var optionalStr: Optional<String> = "Swift" 
optionalStr?.lowercaseStrin //swift
{some "swoft"} //Stringのメソッドを利用してるが戻り型はOptional

//値がnilなら処理せず、nil以外なら処理を実行

  • Implicitly Unwrapped Optional(ややこしいけどここまでがんばれ)
var optionalStr: ImplicitlyUnwrappedOptional<String> = "Swift"
optionalStr.lowercaseString //swift ※戻り型String

// 「!」が不要
// 宣言時、nilじゃないことが確定しているなら使う



Optional型の省略形

var optionalStr: String? = "Swift" // Optional型の場合
var optionalInt: Int! = nil  //ImplicitlyUnwrappedOptionalの場合

上記の「?」「!」の記号は、 OptionalChainingの「?」やForced Unwrappingの「!」とは違う



まとめ

いろいろなサンプルコードを見てると、「?」やら「!」やらが頻発する。 この辺の言語仕様周りには変更がある為、これまで動いていたコードが動かなくなった場合、 最初に疑いたくなるのはこの言語仕様。 気になってソースが負えなくなるくらいなら、ここでサクッと覚えてるとしよう。