2017-07-27 116 views
2

Any?類型值作爲Any?類型參數傳遞時,會引發警告Expression implicitly coerced from 'Any?' to Any,但我看不到在哪裏投射。它也似乎只發生在字典值。下面的例子顯示,當它發生:「傳遞任何內容時隱含任何?在任何類型的變量?類型參數

func someFunc(_ aParam : Any?) {} 

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

如果函數調用正常Any?值,也沒有警告,就像這樣:

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

基本上可選的字典中的值是無意義的斯威夫特 – vadian

回答

3

字典查找返回可選值,因爲密鑰可能不存在。在不存在密鑰的情況下,查找返回nil,因此字典查找的類型必須是可選的。

對於您的情況,您的值爲Any?,因此該字典中的查找會返回雙重包裝的可選Any??。所以你試圖將一個Any??類型的值傳遞給一個需要Any?的函數。

如果使用可選結合處理和解開字典訪問,一切正常:(和BTW在Objective-C禁止)

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」爲零時不會出錯,因爲你打開的所有東西都是找到該值的字典?有無論如何要採取一個N級的可選包裝值,所以我可以傳遞'testDict [「Test」]'而不會因爲解包而崩潰,如果該值爲零或者該密鑰不存在? –

+1

我建議只解開字典查找。如果你想把一個不存在的鍵看作是一個具有'nil'的值,那麼'testDict [「Test」]?零「的作品。至少現在你明白了爲什麼。如果字典中的值爲零,則返回它作爲'Optional(nil)'包裝,'''將其解包爲正常'nil'。 – vacawama

0

只需使用Dictionary<String, Any>代替Dictionary<String, Any?>作爲Dictionary類型。

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

我推斷的從我真正的代碼中的例子,其中字典中的值實際上可以爲零,這意味着我不能使用字典,因爲它會導致編譯錯誤 –

+0

字典不能有一個對應於鍵的零值。 – PGDev

+0

可選值爲零,但它可以有一個可選值,就像我做了然後我可以設置一個零值,如[「test」:nil] –