私はSwiftで遊んでいて、辞書に挿入するオブジェクトをダウンキャストすると、奇妙な警告が表示されることを発見しました: Treating a forced downcast to 'String' as optional will never produce 'nil'
. に置き換えるas
とas?
、警告が消えます。
func test() -> AnyObject! {
return "Hi!"
}
var dict = Dictionary<String,String>()
dict["test"]=test() as String
Appleのドキュメントには次のように書かれています
ダウンキャストは失敗する可能性があるため、型キャスト演算子には 2 つの異なる形式があります。オプションの形式 は
as?
、ダウンキャストしようとしている型のオプションの値を返します。強制形式 はas
、ダウンキャストを試み、結果を単一の複合アクションとして強制的にアンラップします。
as?
ここで代わりに使用するのas
が正しい理由は不明です。いくつかのテストでは、test() を String ではなく Int を返すように変更すると、引き続きas
. using に切り替えるとas?
、コードは通常どおり実行を継続し、そのステートメントをスキップします (dict は空のままになります)。ただし、なぜこれが好ましいのかはわかりません。私の意見では、プログラムがエラーで終了し、キャストが失敗したことを知らせてから、エラーのあるステートメントを単に無視して実行し続けることをお勧めします。
ドキュメントによると、「ダウンキャストが常に成功することが確実な場合にのみ」強制形式を使用する必要があります。test()
この場合、文字列のみを返すことができることがわかっているため、ダウンキャストは常に成功すると確信しているため、これはダウンキャストの強制形式に最適な状況であると想定します。では、なぜコンパイラは警告を出すのでしょうか?