はじめに
Xcode13 で以下のような不思議な警告が出るようになってたので共有しときます(原因わかる方いたらぜひ教えて下さい)。
Conditional downcast from 'String?' to 'String' does nothing

現象
やっていることは hoge?.first
という String??
から String?
にしているだけです。
let hoge: [String?]? = ["hoge"]
let fuga = hoge?.first as? String
print(fuga!)
こちらのコードは Xcode12.5.1 では警告が出ないですが Xcode13.0 だと警告が出るようになっていました。
対応
とりあえず下記のように書くと警告は出ませんでした。
-
パターン1
let hoge: [String?]? = ["hoge"] let foo = hoge?.first let piyo = foo as? String print(piyo!)
-
パターン2
let hoge: [String?]? = ["hoge"] let fuga = hoge?.first ?? nil print(fuga!)
-
パターン3
let hoge: [String?]? = ["hoge"] let fuga = hoge?.first?.flatMap { $0 } print(fuga!)
不思議なのは警告がパターン1の foo as? String
では出ないけど hoge?.first as? String
で出ること(なんでだろう)。

おわりに
けっきょく原因はわかりませんでしたがなんか不思議だなあということで記事にしてみました。
なんかわかる方いればぜひ教えて下さい
Xcode のバージョンアップで今まで問題なかった書き方に警告が出るのはわりとよくある