我在这里搜索过。我已经看到并认为这正在影响它
Swift 中的类初始化是一个两阶段的过程。在第一阶段,每个存储的属性都由引入它的类分配一个初始值。一旦确定了每个存储属性的初始状态,第二阶段就开始,并且每个类都有机会在新实例被认为可供使用之前进一步自定义其存储属性。
当我运行下面的代码时,我收到错误Variable 'self.string' used before being initialized。
但它适用于我不会更改为 var 并初始化的每个变量。这里发生了什么?
这是错误:
下面的不行。
struct IntTextField<T: Numeric & LosslessStringConvertible>: View {
@Binding var number: T?
@State private var string: String
private let isDecimalAllowed: Bool
private let title: LocalizedStringKey
private let onEditingChanged: (Bool) -> Void
private let onCommit: () -> Void
public init(_ titleKey: LocalizedStringKey, number: Binding<T?>, isDecimalAllowed: Bool, onEditingChanged: @escaping (Bool) -> Void = { _ in }, onCommit: @escaping () -> Void = {}) {
self._number = number
self.string = "Why doesn't this work????"
self.isDecimalAllowed = isDecimalAllowed
self.title = titleKey
self.onEditingChanged = onEditingChanged
self.onCommit = onCommit
}
var body: some View {
TextField(title, text: $string, onEditingChanged: onEditingChanged, onCommit: onCommit)
.numericText(text: $string, number: $number, isDecimalAllowed: isDecimalAllowed)
.modifier(KeyboardModifier(isDecimalAllowed: isDecimalAllowed))
}
}
Run Code Online (Sandbox Code Playgroud)
下面的工作(我必须将它们全部更改为var并将它们初始化为某些内容),为什么我必须这样做?
struct IntTextField<T: Numeric & LosslessStringConvertible>: View {
@Binding var number: T?
// Everything below is changed to var and initialized
@State private var string: String = ""
private var isDecimalAllowed: Bool = false
private var title: LocalizedStringKey = ""
private var onEditingChanged: (Bool) -> Void = { _ in }
private var onCommit: () -> Void = {}
// To here
init(_ titleKey: LocalizedStringKey, number: Binding<T?>, isDecimalAllowed: Bool, onEditingChanged: @escaping (Bool) -> Void = { _ in }, onCommit: @escaping () -> Void = {}) {
self._number = number
self.string = "Why does this work????"
self.isDecimalAllowed = isDecimalAllowed
self.title = titleKey
self.onEditingChanged = onEditingChanged
self.onCommit = onCommit
}
var body: some View {
TextField(title, text: $string, onEditingChanged: onEditingChanged, onCommit: onCommit)
.numericText(text: $string, number: $number, isDecimalAllowed: isDecimalAllowed)
.modifier(KeyboardModifier(isDecimalAllowed: isDecimalAllowed))
}
}
Run Code Online (Sandbox Code Playgroud)
由于其属性包装器,该变量与正常变量略有不同@State。要在此处初始化它而不出现该错误,您需要执行以下操作:
self._string = State(initialValue: "Why doesn't this work????")
Run Code Online (Sandbox Code Playgroud)
允许_您string在没有属性包装器的情况下进行访问。事实上,您已经在上面的行中使用Binding类似的策略执行此操作。
在第二个示例中,string已经有默认值"",因此编译器并不担心它尚未设置。
| 归档时间: |
|
| 查看次数: |
1431 次 |
| 最近记录: |