2017-07-27 21 views
2

Any?タイプのパラメータとしてAny?タイプの値を渡すと警告が表示されますが、キャストが発生している場所はわかりません。また、辞書の値でのみ発生するようです。それが起こる場合は、以下の例が示していますAnyを渡すときに「暗黙のAnyからAnyへのキャスト」警告が表示されますか?変数にAnyを入力しますか?タイプパラメータ

func someFunc(_ aParam : Any?) {} 

let testDict : Dictionary<String, Any?> = ["Test": "Hello"]; 
someFunc(testDict["Test"]); 

機能が正常なAny?値で呼び出された場合、警告がそうのような、ありません。

let test : Any? = nil; 
someFunc(test); 
+0

は、基本的には、オプションの辞書の値は、スウィフトに無意味です(。とところでObjective-Cで禁じられて) – vadian

答えて

3

ディクショナリルックアップはキーが存在しない可能性があるため、オプションの値を返します。存在しないキーの場合、ルックアップはnilを返すので、辞書ルックアップのタイプはオプションでなければならない。

あなたの値のタイプはAny?なので、その辞書からルックアップすると二重包装のオプションAny??が返されます。したがって、タイプAny??の値をAny?という関数に渡そうとしています。

あなたが辞書のアクセスを処理し、アンラップするを結合オプションを使用する場合は、すべての作品:

let testDict : Dictionary<String, Any?> = ["Test": "Hello"]; 
if let value = testDict["Test"] { 
    // "Test" key is valid 
    someFunc(value); 
} 
+0

そうすれば、 'let test = someFunc(testDict ["Test"]!) 'あなたがアンラップしたのは値を見つける辞書なので、" Test "がnilのときはエラーになりませんか?とにかく、Nレベルのオプションのラップされた値をとるためには、値がnilであるか、キーが存在しない場合にラッピングされないので、 'test' [" Test "]'をアンラッピングするだけで渡すことができますか? –

+1

辞書検索のラッピングを解除することをお勧めします。存在しないキーを 'nil'を持つ値と同じように扱う場合、' testDict ["Test"] ?? nil'は動作します。少なくとも今、あなたはその理由を理解しています。ディクショナリの値がnilの場合、 'Optional(nil)'としてラップされたものを返し、 '?? 'はそれを通常の' nil'にラップします。 – vacawama

0

ちょうどDictionaryとしてDictionary<String, Any>の代わりDictionary<String, Any?>を使用しますタイプ。

+0

私は外挿私の実際のコードの例では、辞書の値が実際にはゼロになることがあります。つまり、辞書エラーはコンパイルエラーの原因となります。 –

+0

辞書はキーに対応するnil値を持つことはできません。 – PGDev

+0

オプションの値はnilで、任意の値を設定することができます。 ["test":nil]のようなnil値を設定できます。 –

関連する問題