2016-12-26 58 views
4

當我添加一個類型爲'AnyObject?'的值時到類型'[String:AnyObject]'的字典中,該值不能被添加,這實際上是我所期望的。我認爲將可選類型分配給非可選類型應該失敗。Swift dictionary中的可選AnyObject值

var myDict : [String : AnyObject] = [ "Key1" : "Value1" as AnyObject? ] 

但是,爲什麼這個過程如果我首先初始化一個空字典,然後將值添加到它?

var myDict = [String : AnyObject]() 
myDict["Key1"] = "Value1" as AnyObject? 

我見過的GenericKeychain例如這種方法從蘋果 https://developer.apple.com/library/content/samplecode/GenericKeychain/Introduction/Intro.html

+0

什麼是Swift的使用版本?第二個代碼片段也給我一個編譯時錯誤 –

+0

@AhmadF第二個代碼片段對我來說很好,Swift 3,Xcode 8.2 – JAL

+0

@JAL我看到,目前,我在一臺使用xcode 7/Swift 2的機器上: ) –

回答

5

你的第二線工程,因爲subscript覆蓋的字典使用可選:

subscript(key: Key) -> Value? { get set } 

而初始化爲[String : AnyObject]類型字典需要具體類型:

Dictionary init

+0

我明白了,謝謝! – Wullschi

2

在第一個示例中,您使用的是字典文字。字典文字中的值必須與字典的Value類型匹配。

在第二個示例中,您使用的是Dictionarysubscript(key: Key) -> Value?下標來分配值。這裏,Value?可以是可選的,您可以通過指定nil來刪除鍵/值對。

0

在上例中,myDict推薦使用非可選AnyObject,而分配的是可選AnyObject。這是錯誤的原因。這將解決您的問題。

var myDict : [String : AnyObject?] = [ "Key1" : "Value1" as AnyObject?] 
+0

是的,但這個答案沒有解釋*爲什麼*下標可以選擇一個,但字典文字不能。 – JAL