初始化问题之前使用的另一个变量“__”
Posted
技术标签:
【中文标题】初始化问题之前使用的另一个变量“__”【英文标题】:Another Variable '__' used before being initialized question 【发布时间】: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 ;) 【参考方案1】:由于其@State
属性包装器,该变量与正常情况略有不同。要在此处初始化它而不会出现该错误,您需要这样做:
self._string = State(initialValue: "Why doesn't this work????")
_
允许您在没有属性包装器的情况下访问 string
。事实上,您已经使用Binding
以类似的策略在上面的行中执行此操作。
在您的第二个示例中,string
已经有一个默认值 ""
,因此编译器并不担心它尚未设置。
【讨论】:
值得注意的是,如果我将声明更改为:@State private var string: String = ""
并将初始值设定项保持为 self.string = "Why Doesn't this Work??"
,那么错误会转到 Variable 'self.isDecimalAllowed' used before being initialized
,这会导致“为什么会这样”工作???”使固定。我不知道为什么。以上是关于初始化问题之前使用的另一个变量“__”的主要内容,如果未能解决你的问题,请参考以下文章
cuda 的 __shared__ 变量不允许使用初始化程序