当 self 尚未初始化时,如何在 属性 包装器中使用现有的 属性? (斯威夫特用户界面)
How do I use an existing property in a property wrapper when self hasn't been initialized? (SwiftUI)
我在 属性 包装器中有一个包含两个变量的结构。其中一个变量应该是从另一个变量计算出来的。当我尝试这样做时,出现以下错误:
Cannot use instance member 'name' within property initializer; property initializers run before 'self' is available.
我尝试为这些变量分配一个临时值,然后在自定义 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
。谁能告诉我我做错了什么?
要在初始值设定项中使用 属性 包装器,请使用带有下划线的变量名。
对于状态,您使用 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
您不能在初始类型定义之外使用下划线名称。
我在 属性 包装器中有一个包含两个变量的结构。其中一个变量应该是从另一个变量计算出来的。当我尝试这样做时,出现以下错误:
Cannot use instance member 'name' within property initializer; property initializers run before 'self' is available.
我尝试为这些变量分配一个临时值,然后在自定义 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
。谁能告诉我我做错了什么?
要在初始值设定项中使用 属性 包装器,请使用带有下划线的变量名。
对于状态,您使用 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
您不能在初始类型定义之外使用下划线名称。