Документация SwiftUI для оболочки свойств @State - PullRequest
1 голос
/ 26 января 2020

Недавно я столкнулся с проблемой, когда мне пришлось инициировать переменную @State в моем методе init. Этот пост помог мне понять это.

Я понял, что это способ сделать это:

@State var fullText: String // No default value of ""

init(letter: String) {
    _fullText = State(initialValue: list[letter]!)
}

Я понимаю, что @State это свойства оболочки, и я прочитал документацию по свойствам оболочки. А из другого чтения я обнаружил под капотом этот код:

@State private var flag = false

переводится в этот код:

private var _flag: State<Bool> = State(initialValue: false)
private var $flag: Binding<Bool> { return _flag.projectedValue }
private var flag: Bool {
    get { return _flag.wrappedValue }
    nonmutating set { _flag.wrappedValue = newValue }
}

Мой вопрос: где задокументировано, что _variableName создается из метода обернутых свойств, и я могу переопределить его? Как разработчик SwiftUI должен знать это из документации Apple? Я пытаюсь найти то, что я предполагаю, Документация, по которой я скучаю.

1 Ответ

0 голосов
/ 26 января 2020

Поскольку оболочки свойств были предложением Swift Evolution и были разработаны как часть философии открытого кода Swift, мы можем найти лучшую документацию непосредственно в документе Предложение SE-0258 . Здесь описывается обоснование дизайна @propertyWrapper и точная спецификация того, как они реализованы (включая определения упакованных значений и прогнозируемых значений ).

Разделы, которые могут помочь в вашем понимании:

§ Тип оболочки свойства предоставляет хранилище для свойства, которое использует его в качестве оболочки. Свойство wrappedValue типа оболочки обеспечивает фактическую реализацию оболочки, а (опционально) init(wrappedValue:) включает инициализацию хранилища по значению типа свойства.

Использование префикса _ для имени синтезированного свойства хранилища является преднамеренным: оно предоставляет предсказуемое имя для синтезированного свойства хранилища, которое соответствует установленным соглашениям для частных хранимых свойств.

[...]

§ Тип оболочки свойства может предоставить свойство проекции (например, $foo), чтобы предоставить больше API для каждого свойства обертки, определив свойство projectedValue. Как и в случае свойств wrappedValue и init(wrappedValue:), свойство projectedValue должно иметь тот же уровень доступа, что и его тип оболочки свойства.

Поскольку оболочки свойств являются новыми для Swift в целом, на мой взгляд, документации по-прежнему не хватает на стороне Apple, особенно когда речь идет о SwiftUI. Однако есть только несколько обёрток свойств, о которых мы действительно должны знать (@State, @Binding, @EnvironmentObject, @ObservedObject, @Published), чтобы полностью использовать SwiftUI; все другие аспекты SwiftUI (такие как View типы) довольно хорошо документированы в документах Apple для разработчиков.

Кроме того, статьи, опубликованные в сообществе Swift ( пример ), могут помочь вам получить gr asp о том, где вы можете захотеть реализовать обёртки свойств самостоятельно!

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