我一直收到一个错误/lint,内容为Variable 'self.item' used before being initialized
。仅当我似乎添加了 @State
类型的 Date
时才会出现此消息(请参阅下面的注释行)。
变量 item
是我试图通过表单更新的 CoreData
值。所有其他必需的数据类型(整数、字符串、数据等)都按预期工作。
我相当有信心这是一个问题,因为我缺乏 Swift 或声明式语言的经验,但我也担心这可能是编译器问题,因为我似乎遇到了还有一些。
import SwiftUI
struct SelectionView: View {
@State var item : Item
@Environment(\.managedObjectContext) private var viewContext
@State private var name : String
@State private var imageData : Data
@State private var timestamp : Date // error only appears when this line is added
init(item : Item) {
self.item = item
self._name = State(initialValue: item.name!)
self._imageData = State(initialValue: item.imageData!)
self._timestamp = State(initialValue: item.timestamp!)
}
var body: some View {
VStack {
Form
{
TextField("Name", text: $name)
Image(uiImage: UIImage(data: imageData)!)
Button(action: changeImage, label: { Text("Change image") })
Button(action: save, label: { Text("Save") })
}
}
.padding()
}
...
答案 0 :(得分:0)
只需执行以下操作:
@State var item: Item
init(item: Item) {
_item = State(initialValue: item)
}
您可以访问您可能需要的所有内容:
item
$item.name
(相当于你有 $name
时,下面的其他也一样)$item.imageData
$item.timestamp
另外,如果你不需要传入任何其他东西,你也可以去掉初始化器,因为它是一个推断的成员初始化器。
您遇到错误的原因:
self.item
尚不存在。您将 @State
设置为 _item
,这将生成 item
和 $item
变量。
我们可以看到这一点,因为看到 State
的定义显示了以下内容:
public var wrappedValue: Value { get nonmutating set } // Normal value
/* ... */
public var projectedValue: Binding<Value> { get } // Binding value
因此,由于 self.item
尚未初始化而无法访问 _item
,因此您会收到错误消息。这就是我们使用 _item
设置 State(initialValue:)
的原因。