初始化问题之前使用的另一个变量“__”

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,这会导致“为什么会这样”工作???”使固定。我不知道为什么。

以上是关于初始化问题之前使用的另一个变量“__”的主要内容,如果未能解决你的问题,请参考以下文章

猴子在Python的另一个模块中修补一个类

Python的类成员变量默认初始值的坑

cuda 的 __shared__ 变量不允许使用初始化程序

在 Python 中初始化一个字符串变量:“”还是无?

是否可以根据从 Swift 中的 UIViewController 继承的类中的另一个来初始化变量?

动手动脑___11.07