【发布时间】:2021-05-13 01:26:58
【问题描述】:
我在这里搜索过。我已经看到并认为这正在影响它
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))
}
}
以下工作(我必须将它们全部更改为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))
}
}
【问题讨论】:
-
不错的截图,但字体很难阅读;)
-
@AnderCover 哈哈,我在 VSCode 中购买了我喜欢的 Dank Mono。我正在讨论我的 Xcode 生活。
-
Xcode 和 emacs 是我真正用过的两个 IDE,所以如果你不喜欢 Xcode 我只能告诉你尝试使用 emacs ;)