В Swift 4.1, когда вы делаете:
var str: String!
str = "Hello"
var params: [String: Any] = [
"foo": str
]
Значение ImplicitlyUnwrappedOptional
(IUO) приводится к Any
, поэтому оно отображается как IUO внутри вашего словаря. Это не будет принудительно развернуто, потому что компилятор принудительно развернет IUO только тогда, когда контекст требует его развернутого типа, что не имеет место с Any
.
Однако тот факт, что вы получите ImplicitlyUnwrappedOptional
значение , является устаревшим поведением. После удаления типа IUO в Swift 4.2 вы получите значение Optional
внутри словаря, которое будет печататься как Optional("Hello")
.
В этом разделе «Вопросы и ответы» обсуждается вышеупомянутое поведение:
Когда вы делаете:
params["bar"] = str
Вы используете Dictionary
subscript(key: Key) -> Value?
, который принимает значение Optional
- выполняет удаление, если передано nil
, в противном случае выполняется вставка развернутого значения.
- В Swift 4.1 значение IUO
str
будет неявно преобразовано в Optional
, который затем может быть передан в индекс.
- В Swift 4.2 тип IUO был удален, поэтому
str
уже равно и Optional
, которые могут быть переданы прямо в индекс без каких-либо промежуточных преобразований.
В обоих случаях развернутое значение str
вставляется в словарь, поэтому вы видите его развернутым. Если бы str
было nil
, значение для ключа "bar"
не было бы вставлено.