Как использовать существующее свойство в оболочке свойств, если self не было инициализировано? (SwiftUI) - PullRequest
1 голос
/ 02 апреля 2020

У меня есть структура с двумя переменными внутри оболочки свойств. Предполагается, что одна из переменных вычисляется из другой. Когда я пытаюсь сделать это, я получаю следующую ошибку:

Невозможно использовать элемент экземпляра 'name' в инициализаторе свойства; инициализаторы свойств запускаются до того, как станет доступным 'self'.

Я попытался присвоить временные значения этим переменным, а затем переназначить их в пользовательской функции init (), но, похоже, это не рабочий эфир. Я сделал упрощенную версию кода, чтобы посмотреть, смогу ли я изолировать проблему.

import SwiftUI

struct Person {
    @State var name: String = ""
    @State var nameTag: NameTag = NameTag(words: "")

    init(name: String) {
        // not changing name and nameTag
        self.name = name
        nameTag = NameTag(words: "Hi, my name is \(name).")
    }
}


class NameTag {
    var words: String

    init(words: String) {
        self.words = words
    }
}


var me = Person(name: "Myself")
// still set to initial values
me.name
me.nameTag.words

Я заметил, что когда я изменил nameTag на @ObservedObject, а не на @State, он мог быть повторно назначен правильно. Хотя я не верю, что могу изменить имя на @ObservedObject. Может кто-нибудь сказать мне, что я делаю не так? Я довольно новичок в Swift, так что все помогает.

1 Ответ

0 голосов
/ 02 апреля 2020

Чтобы использовать оболочки свойств в инициализаторах, вы используете имена переменных с предшествующими символами подчеркивания.

А с State вы используете init (initialValue:) .

struct Person {
  @State var name: String
  @State var nameTag: NameTag

  init(name: String) {
    _name = .init(initialValue: name)
    _nameTag = .init( initialValue: .init(words: name) )
  }
}

Вот как на самом деле выглядит свойство @State, так как ваши уровни синтаксиса c sugar:

name
_name.wrappedValue
$name.wrappedValue
_name.projectedValue.wrappedValue

Нельзя использовать имя подчеркивания за пределами исходного определения типа.

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