почему я не могу вызвать изменяемую функцию в кнопке - PullRequest
0 голосов
/ 08 мая 2020

Я все время получаю сообщение об ошибке, когда пытаюсь вызвать свою функцию при нажатии кнопки. Я новичок в Swift, поэтому может быть очевидная ошибка. Вот код, который у меня должен включать ошибку. Я искал другие ответы на этот вопрос, но ничего не нашел. Я не знаю, что мне нужно сделать, чтобы вызвать изменяемую функцию.

    import SwiftUI

    struct ContentView2: View {

@State public var weightLifted:Int
@State public var repsPerformed:Int
@State private var percentOfReps:Double = 0.0
@State private var oneRepMax:Double = 0.0

var weightAtEachPercent:Array = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

mutating func calcMax() {

    switch repsPerformed {
    case 1: percentOfReps = 1.0
    case 2: percentOfReps = 0.975
    case 3: percentOfReps = 0.95
    case 4: percentOfReps = 0.925
    case 5: percentOfReps = 0.9
    case 6: percentOfReps = 0.875
    case 7: percentOfReps = 0.85
    case 8: percentOfReps = 0.825
    case 9: percentOfReps = 0.8
    case 10: percentOfReps = 0.75
    case 11: percentOfReps = 0.725
    case 12: percentOfReps = 0.7125
    case 13: percentOfReps = 0.7
    case 14: percentOfReps = 0.685
    case 15: percentOfReps = 0.675
    default:
        percentOfReps = 0.5
    }
   oneRepMax = Double(weightLifted) / percentOfReps

    weightAtEachPercent[0] = oneRepMax
    weightAtEachPercent[1] = oneRepMax * 0.975
    weightAtEachPercent[2] = oneRepMax * 0.95
    weightAtEachPercent[3] = oneRepMax * 0.9
    weightAtEachPercent[4] = oneRepMax * 0.875
    weightAtEachPercent[5] = oneRepMax * 0.825
    weightAtEachPercent[6] = oneRepMax * 0.75
    weightAtEachPercent[7] = oneRepMax * 0.7125
    weightAtEachPercent[8] = oneRepMax * 0.675
}
var body: some View {

 Button(action: {
                //Place of error
                //I tried using self.calcMax() as well but same error
                //Error "Cannot use mutating member on immutable value: 'self' is immutable 
                calcMax()
            }) {
                Text("Calculate")
}
}
}

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Просмотры неизменяемы. Они могут хранить информацию в @State переменных, которые будут скопированы в новые неизменяемые экземпляры, но само представление не может измениться. Поэтому функции просмотра не могут быть mutating.

Каждая часть информации должна иметь единственный источник правды. Если эта информация является полностью внутренней по отношению к представлению, и ничто за пределами представления не должно ее видеть, отметьте ее @State. Если это нужно для чего-то вне представления, но представление должно иметь возможность сигнализировать об изменении, сделайте его @Binding. Если это модель, на которую представление должно реагировать, сделайте это @ObservedObject.

В вашем случае обновленные значения уже @State, и изменение состояния фактически не меняет представление (оно запускает создание нового представления). Так что можно просто удалить модификатор mutating.

0 голосов
/ 08 мая 2020

Пробовали ли вы добавить @State в массив?

и помните, что @State всегда считается закрытым, потому что, когда вы используете @State, вы, по сути, говорите, что SwiftUI владеет это мнение.

Лучшее решение - использовать вместо этого @Binding или @ ObservableObject / @ ObservableObject.

Более подробное описание можно найти здесь :

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