煽ってみるタイトル。
先に結論
先にまとめをば。
- XCodeが出してくるエラーメッセージは結構的はずれなところを示してくるので、真に受けないこと。
- 今まで問題がなかったところに対して突然エラー指摘してきたときは、たいていその部分は間違っていない。
- 直前に自分自身がやったことをよく思い出して、その周辺を注意深く見てみる。
バグつぶしの基本でしたね。
でも、XCode先生がエラーだというと本当にそう思い込んでしまうから恐ろしい。
何事も根拠のないことに振り回されず、本質を見つけていくことが大切です。
なにはともあれもちつけ。いや落ち着け。
ここからは自戒を込めてざっくりとした経緯を残しておきます。
事の起こり
XCode先生ご乱心!
これまで順調に動いていたコードたちが一斉にエラーを吐き出したんです。
- Textビューの
.font(.title)
←'Font' is not convertible to 'Font?'
- Imageビューの
.frame(width:300, height: 300)
←'CGFloat' is not convertible to 'CGFloat?'
- Alertビューの
secondaryButton: .cancel(Text("Cancel"))
←Reference to member 'cancel' cannot be resolved without a contextual type
- Pickerビューで選択しても、@Stateを変数に値が反映されなくなった。
などなど。なんという嫌がらせ。泣きそう。
どのエラーもさっぱり原因が判らない。どれもエラーが出る直前まで触っていたところから遠く離れたコードです。
ただ、よく言われるように、火のないところに煙は立たないんです。きっと何かしたはずなんです。
エラーが出てくる直前にやったこと
1日悩みました。それでもやっぱり火元がわからない。
こういうときは一度離れて頭を冷やすのが良いとじっちゃんが言ってた。
エラーが溢れ出てくる直前に、DBから持ってきた値を表示させる処理をいじっていました。
持ってきたレコードをせっせと構造体に詰めて(ここでいうrecordに詰めて)、その中の注記(ここでいうremarks)をTextビューに出していきます。
Text(record.remarks)
このとき、私はうっかりunwrapを忘れていました。DB側でnil(null)が入り得ない状態にしていたので、optionalにも関わらずそのまんま書いてしまったんですね。
でも、TextビューはDB側の状態なんて知ったことではない。nilが来るかもしれないと身構えているのです。
なので、nilが100%来ないことを知っている私が強制unwrapをしてあげないといけなかったわけです。
(もしくは、remarksをnon-optionalにしてしまうか)
そして解決へ
火があっても煙って出ないんですね。そして、火がなくても煙はモクモク出るんですね。
煙とは一体!?火とはなんぞや!?
ちょっとよくわからないことを言っているので流しておいてください。
Text(record.remarks!)
あら不思議!エラーがたちどころになくなりました。
もしやXCode先生は'Font' is not convertible to 'Font?’
というエラーでoptionalのことをさり気なく遠回しに伝えようとしていたのか?
伝わらねぇよ!
冒頭でも書きましたが、エラー表示に惑わされず、まずは落ち着くことが大切です。
参考
ついでに「Textビューにnilを渡せない」ことも確認できました。当然といえば当然。
それと、エディタの設定にもよりますが、ハイライト表示(カラフルになるやつ)が急にモノクロームな状態になったところにエラーの原因があることが多いような気がします。