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

うさがにっき

読書感想文とプログラムのこと書いてきます

Optionalについて

swift

概要

swiftのOptionalはnilを許可するかどうかのこと
nilを許可した場合でも、いくつか独特のnilチェック機構を持っている

  • if文でのnil比較
  • Optional Binding
  • ??演算子
  • Optional Chaining

詳細

Optionalとは?

これまでnilチェックのし忘れによるエラーが多かったため通常の変数ではnilを許可しないようにした

var teaName: String = "Darjeeling"
teaName = nil // コンパイルエラー

ただし、nilを使うこともあるので型名の後ろに?をつけることによってnilを代入できるようになる

var teaName: String? = "Darjeeling"
teaName = nil // コンパイルエラー

この型名の後ろに?をつける仕組みをOptionalという
型の後ろに?がつくとOptional型となりString型とは違う挙動をする

Optionalのnilチェック方法は?

if文でのnil比較

これまでと同じようにif文を使ったnilチェック処理

// teaNameはOptionalのString?型
if teaName != nil {
    teaName! += "is tasteful"
}

teaNameはString?型であるため、String型の文字列の結合が通常ではできない
そこでOptionalの強制アンラップ機能を使う
変数名の後ろに!をつけることにより、一時的に元の型に戻すことができる
nilの入ったOptionalを強制アンラップしようとするとエラーになるので矯正アンラップする前には必ずnilチェックすることを忘れない

if let文とif var文によるOptional Binding

nilチェックと強制アンラップを同時に行う方法

// cakeNameはOptional
if var name = cakeName {
    name += "is tasteful"
}

ここでcakeNameがnilでなければ変数nameに値に格納されて、変数が書き換えられる
nilであれば処理が実行されない

??演算子を使う
// userNameはOptional
var name = userName ?? "Anonymous User"

nilでなかった場合、userNameがnameに代入
nilだった場合??の右辺がnameに代入される

Optional Chaining

強制アンラップは伴わないが、nilチェックを効率的に行う方法
クラス自体がOptionalだがその中の変数にアクセスする際に用いられる

class Sweet {
    init(name: String) {self.name = name}
    var name:String
}

var sweet: Sweet? = Sweet(name:"Roll Cake")
// "Roll Cakeが入る"
var sweetNameA = sweet?.name

sweet = nil
// sweetはnilなのでnameへのアクセスをやめ、sweetNameBへはnilが入る
var sweetNameB = sweet?.name
広告を非表示にする