Ленивый не будет работать! Невозможно использовать экземпляр элемента 'field' в инициализаторе свойства; инициализаторы свойств запускаются до того, как станет доступным 'self' - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь создать форму, в которой будет что-то набирать (str), TextField для ввода и какой-то текст ниже (var = правильное), чтобы сообщить мне, если у меня есть правильное до сих пор.

Например, (str) = "hello world", если "hel" находится в текстовом поле, текст ниже будет иметь значение "True". Проблема в том, что я не могу правильно использовать (str) и (field). Мне кажется, что подобные вопросы здесь решаются с помощью 'lazy', но это не сработает, потому что ("свойство 'field' с оберткой также не может быть lazy").

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 голосов
/ 13 января 2020

Самым простым решением было бы удалить свойство 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)
            }

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...