Быстрое явное объявление переменной с необязательным

#swift

Вопрос:

Я новичок в Swift и пытаюсь расшифровать один из примеров Apple. Не мог бы кто-нибудь, пожалуйста, объяснить, что делает эта линия ?

 @SceneStorage("selection") private var selectedProjectID: Project.ID?
 

Проект — это структура, соответствующая Codable и Identifiable

Выбирается объект того же типа, что и Project.ID? ?

Комментарии:

1. Это означает selectedProjectID , что может быть установлено nil . Так что вы могли бы это сделать selectedProjectID = nil .

2. Спасибо, я понял это немного … извините, должно было быть понятнее. Выполняет проект. Бит идентификатора означает, что выбранный идентификатор ProjectID будет явно иметь тот же тип, что и проект. Член ID в структуре ?

3. Project.ID вероятно, относится к вложенной структуре — значит ID , структура где-то вложена в Project структуру. Вложенность на самом деле ничего не значит, просто вы не сможете ссылаться ID на нее сами по себе — вам нужно использовать Project.ID .

4.Нет, вы неправильно поняли. Project.ID это не какое-то id свойство проекта. Это другой тип, объявленный внутри проекта. См. Документы по вложенным типам. docs.swift.org/swift-book/LanguageGuide/NestedTypes.html

5. Спасибо, я неправильно понял, что идентификатор был членом, а не вложенным типом.

Ответ №1:

В общем для некоторого типа, T , T? является синтаксическим сахаром для Optional<T> .

Optional<T> определяется как enum со специальной поддержкой компилятора для сравнений и назначений nil . Это выглядит примерно так.

 enum Optional<Wrapped>
{
    case none
    case some(wrapped: Wrapped)
}
 

Поэтому , когда необязательный nil , это на самом деле .none

В комментариях вы спросили:

Выполняет проект.Бит идентификатора означает, что выбранный идентификатор ProjectID будет явно иметь тот же тип, что и проект.Член ID в структуре ?

Ответ-нет. selectedProjectID является свойством экземпляра (переменной), типом которого является Optional<Project.ID> . Project.ID это типаж. У него также есть тип, мета-тип (тип типа), но я не думаю, что вы хотите спросить об этом. Я думаю, вы спрашиваете, selectedProjectID совпадает ли тип со id свойством, которое определено Project как часть его соответствия Identifiable . И ответ-нет, не совсем так.

Если someProject является экземпляром Project , то someProject.id имеет тип Project.ID , тогда selectedProjectID как имеет тип Optional<Project.ID> .

Существует большая поддержка компилятора, позволяющая извлекать, сравнивать и назначать параметры и их обернутый тип, но, строго говоря, они являются разными типами, так же как Int и Array<Int> являются разными типами.

С другой стороны, если предположить someProjectID , что это не nil так, то someProjectID! (т. е. Принудительно развернутое) относится к тому же типу, someProject.id что и . Аналогично в

 if let pID = someProjectID {
    ...
}
 

в пределах if , pID также является тем же типом, что и someProject.id