#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.html5. Спасибо, я неправильно понял, что идентификатор был членом, а не вложенным типом.
Ответ №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