Как использовать существующее свойство в оболочке свойств, если self не инициализирован? (SwiftUI)

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

Нельзя использовать имя члена экземпляра в инициализаторе свойства; Инициализаторы свойств запускаются до того, как станет доступным "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. Может ли кто-нибудь сказать мне, что я делаю не так?

2 ответа

Решение

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

А с 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 свойство действительно выглядит, как ваш уровень синтаксического сахара:

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

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

Это также произошло, когда вы создаете приложение для старой ОС iPhone для тех, Apple не предоставляет обновления, потому что они устарели. использовать, например

      if #available(iOS 16.0, *) {

 } else {
     // Fallback on earlier versions
 }

в каждой отдельной строке, где отображается это предупреждение.Примечание. Не используйте его в начале тела класса или структуры, используйте его там, где это необходимо.

Другие вопросы по тегам