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で条件を判定させるように変更した。