2016-12-26 11 views
4

Когда я добавляю значение типа «AnyObject?» в словарь типа '[String: AnyObject]' следующим образом, значение не может быть добавлено, что на самом деле то, что я ожидал. Присвоение необязательного типа необязательному типу, по моему мнению, должно завершиться неудачей.Необязательные значения AnyObject в словаре Swift

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

Но почему эта процедура работает, если я сначала инициализирую пустой словарь, а затем добавлю к нему значение?

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

Я видел этот подход в примере GenericKeychain от компании Apple 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.

Во втором примере для присвоения значения используется Dictionary индекс subscript(key: Key) -> Value?. Здесь Value? может быть необязательным, который можно использовать для удаления пары ключ/значение, назначив nil.

0

В приведенном выше примере myDict выведено без необязательного AnyObject, в то время как назначенный является необязательным AnyObject. Это и есть причина ошибки. Это решит вашу проблему.

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

Да, но этот ответ не объясняет * почему * индекс может взять необязательный, но словарный литерал не может. – JAL