Мне любопытно, почему этот фрагмент корректно работает в Playground:
var dict = [String: String]()
dict["key"] = nil
let value = dict["key"]
мы видим, что я объявил Dictionary с необязательными значениями, после проверки его на Playground он работает аналогично словарю, объявленному как [String: String?]
У меня вопрос: в чем разница в настройке значения nil
между словарем, объявленным как [String: String]
, и [String: String?]
?
dict["key"] = nil
- это сокращение для удаления ключа из словаря (то же самое, что и при использовании dict.removeValue(forKey: "key")
). Если под ключом "key"
было значение, после этой строки запись весь удаляется из словаря (как ключ, так и значение).
Прочтите индексы документы, чтобы узнать больше:
If you assign nil as the value for the given key, the dictionary removes that key and its associated value.
In the following example, the key-value pair for the key "Aquamarine" is removed from the dictionary by assigning nil to the key-based subscript.
hues["Aquamarine"] = nil print(hues) // Prints "["Coral": 18, "Heliotrope": 296, "Cerise": 330]"
let value = dict["key"]
получает значение для ключа и по определению возвращает nil
, если для данного ключа нет записи (что в вашем случае).
Согласно документы, нижний индекс возвращает либо значение, либо ноль, если ключа нет в словаре:
The value associated with key if key is in the dictionary; otherwise, nil.
dict["key"] = nil
означает, что вы удаляете элемент из словаря. Тип возврата dict[someKey]
- Необязательный, так как ключа там может не быть.
Вы можете рассмотреть возможность реализации:
dict["key"] = nil
аналогично вызову removeValue(forKey:)
:
dict.removeValue(forKey: "key")
По умолчанию получение значения из словаря возвращает значение по желанию:
var dict = [String: String]()
dict["key"] = "Hello"
let value = dict["key"] // Optional("Hello")
Обратите внимание, что тип value
- это необязательная строка (String?).
@dwonvoter неуместно голосовать против, не упоминая, в чем причина этого :)