😅

Swift の URL の init(string:) は nil をも返す

2024/09/29に公開

Swift で,受け取った String を URL オブジェクトに変換してくれるやつありますよね.
https://developer.apple.com/documentation/foundation/url/3126806-init

さて,こんな 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}/ みたいになってて目が滑って {} の存在にまじで気づかなかったです,つらすぎ🥹
https://github.com/auth0/Auth0.swift/blob/0d9c3f3241e3defad065409ac3a071ee1c5a7e8a/Auth0/NSURL%2BAuth0.swift#L5-L10

呼び出し元が悪いと思ってめちゃくちゃ Call Hierarchy で遡ってました.強制アンラップ怖ァ

Discussion