懒惰不会工作!无法在属性初始化程序中使用实例成员“ field”;属性初始化程序在“自我”可用之前运行

时间:2020-01-13 09:57:30

标签: swift swiftui

我正在尝试制作一种可以在(str)中键入内容的表格,一个可以在其中键入内容的TextField以及下面的一些文本(变量=正确),让我知道到目前为止是否正确。

例如,(str)=“ hello world”,如果文本字段中包含“ hel”,则下面的文本将显示为“ True”。 问题是我似乎无法正确使用(str)和(field)。我在这里似乎遇到了类似的问题,这些问题可以通过“懒惰”解决,但不会起作用,因为(“带有包装器的属性“字段”也不能是懒惰的”)。

func stringSlice(string: String, first: Int, last: Int)->String{
    var newStr = ""
    for number in 0..<string.count{
        if first <= number{
            if number <= last{
                newStr += "\(string[string.index(string.startIndex, offsetBy: number)])"
            }
        }
    }
    return newStr
}


func checkSoFar(answer: String, guess: String)->String{
    if stringSlice(string: answer, first: 0, last: guess.count) == guess{
        return "True"
    }
    return "False"
}


struct thisView: View{
    var str = "Hello world!"
    @State private var field = ""
    @State private var correct = checkSoFar(answer: str, guess: field)
    var body: some View{
        Form{
            Text(self.str)
            TextField("Type the above", text: $field){
            }
            Text(correct)
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        thisView()
    }
}

任何想法将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是删除correct属性并执行

var body: some View{
    Form{
        Text(self.str)
        TextField("Type the above", text: $field){
        }
        Text(checkSoFar(answer: str, guess: field))
    }
}

但这也许也是一种前进的方法:按下按钮时调用checkSoFar函数

struct thisView: View{
    var str: String = "Hello World!"
    @State private var field: String = ""
    @State private var correct: String = ""

    init(answer: String) {
        str = answer
    }

    var body: some View{
        Form{
            Text(self.str)
            TextField("Type the above", text: $field){
            }
            Text(correct)
            Button("Try") {
                self.correct = checkSoFar(answer: self.str, guess: self.field)
            }

        }
    }
}