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

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

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

Swift2のguard let構文で順序を意識せずクラッシュする書き方をしていた話

Swift2のプロジェクトの話
NSTimerを扱う処理を書いており、userInfoにBool値を渡して、後から安全にキャストして取り出す処理をguard letを使って下記のように書いていた。

// Swift2
// before
func hoge(timer: NSTimer?) {
    guard let timer = timer, flag = timer.userInfo as? Bool where timer.valid else {
        return
    }
    print(flag)
}

しかし、timer.invalid()を呼んだ後だとreturnで返る前にクラッシュしていた。


修正後は下記のように記述。

// Swift2
// after
func hoge(timer: NSTimer?) {
    guard let timer = timer where timer.valid, let flag = timer.userInfo as? Bool else {
        return
    }
    print(flag)
}

自分の解釈ではwhereは末尾につけなければいけないと思い込んでいたがために、timer.invalid()でuserInfoがnilになっているにも関わらず、timerから取り出そうとしてクラッシュしていた。

なので、timerをOptional Bindingで取り出した後、whereで条件を判定させるように変更した。