Swift の URL の init(string:) は nil をも返す
Swift で,受け取った String を URL オブジェクトに変換してくれるやつありますよね.
さて,こんな Swift のコードがあったとします.
let urlString = Dotenv["URL"]
let url = URL(string: urlString)!
上記の urlString には .env ファイルから読み取った https://sample.com/
が入るようにしました.
しかし実行すると let url = URL(string: urlString)!
の部分で Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
って怒られてしまいました.
Xcode 上で確認しても urlString には値がちゃんと入ってるのになんで nil
になるんや😡😡😡と思っていましたが,ただただ .env ファイルに格納している url の形式が変なだけでした.
▼やってしまっていたのはこれ
URL={https://sample.com/}
▼正しくはこう
URL=https://sample.com/
なんでこんなミスをしてしまったかと言うと,サンプルコードの下記の YOUR_URL
の部分だけを雑に変えてしまっていました.
URL={YOUR_URL}
変なバグを踏んだと思って難しく考えすぎて時間をちょっと溶かしました.しょうもな〜〜〜!!!!!!!!!!
String が URL として有効な値じゃない時は nil
を返す,Apple のドキュメントにも書いてあるしね!!!!!!!!ちゃんと読もうな!!!!!!!!!!!!!!!!!
This initializer returns nil if the string doesn’t represent a valid URL even after encoding invalid characters.
実際エラーを吐いていたのは下記ライブラリ側のコードで,domain の部分だけ渡して https://
部分などは後からがっちゃんこさせていました.
なので Xcode の確認時に https://{sample.com}/
みたいになってて目が滑って {}
の存在にまじで気づかなかったです,つらすぎ🥹
呼び出し元が悪いと思ってめちゃくちゃ Call Hierarchy で遡ってました.強制アンラップ怖ァ
Discussion