在初始化之前使用的变量错误(Swift)

我一直收到一个错误/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()
    }

    ...
LoongWalker 回答:在初始化之前使用的变量错误(Swift)

只需执行以下操作:

@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:) 的原因。

本文链接:https://www.f2er.com/9535.html

大家都在问