Насколько допустима установка «nil» в качестве значения словаря [string: string]?

Мне любопытно, почему этот фрагмент корректно работает в Playground:

var dict = [String: String]()
dict["key"] = nil
let value = dict["key"]

мы видим, что я объявил Dictionary с необязательными значениями, после проверки его на Playground он работает аналогично словарю, объявленному как [String: String?]

У меня вопрос: в чем разница в настройке значения nil между словарем, объявленным как [String: String], и [String: String?]?

5
0
120
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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 неуместно голосовать против, не упоминая, в чем причина этого :)

Ahmad F 12.04.2018 15:17

Другие вопросы по теме