Неявно UnwrappedOptional в init против позже - PullRequest
0 голосов
/ 27 апреля 2018

Я хотел бы понять, почему я не получаю ImplicitlyUnwrappedOptional, когда делаю params["bar"] = str, но получаю его, когда объявляю params с той же самой переменной развернутой силы.

см. Игровую площадку ниже:

import UIKit

var str: String!

str = "Hello"

var params: [String: Any] = [
    "foo": str
]

params["bar"] = str

print(params)

// ["bar": "Hello", "foo": Swift.ImplicitlyUnwrappedOptional<Swift.String>.some("Hello")]

1 Ответ

0 голосов
/ 12 мая 2018

В 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" не было бы вставлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...