Как использовать существующее свойство в оболочке свойств, если 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
}
в каждой отдельной строке, где отображается это предупреждение.Примечание. Не используйте его в начале тела класса или структуры, используйте его там, где это необходимо.