Попытка изменить значение внутри цикла for in - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь изменить значение внутри l oop. Значение - это логическое значение, которое я объявил как var, а не let, но я получаю сообщение об ошибке «Невозможно использовать изменяющийся член для неизменяемого значения: notat - это константа let»

Итак, я пытаюсь сделать это так, что когда я нажимаю на изображение внутри кнопки в моем списке, оно изменяет завершенное (bool) значение на true. И я хочу, чтобы при завершении == true я получал заполненную галочку

import SwiftUI

struct Notat : Identifiable
{
    let id = UUID()
    var cost: Int
    var name: String
    var completed: Bool
}

struct ContentView: View {

    var modelData: [Notat] =
        [Notat(cost: 50, name: "Klippe plenen", completed: false),
         Notat(cost: 100, name: "Vaske speil", completed: true),
         Notat(cost: 150, name: "Støvsuge huset", completed: false),
         Notat(cost: 50, name: "Vaske bilen", completed: true)]
    
    var body: some View {
        List(modelData)
        {
            notat in HStack
                {
                    Text("\(notat.cost)kr").frame(width: 50, height: 10, alignment: .leading)
                    Text(notat.name)
                    Button(action: /*@START_MENU_TOKEN@*/{}/*@END_MENU_TOKEN@*/)
                    {
                        Image(systemName: checkmarkSymbol(completed: notat.completed)).font(Font.system(size: 25, weight: .light))
                            .onTapGesture
                            {
                                test(notat: notat)
                            }
                    }.frame(maxWidth: .infinity, alignment: .trailing)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

func checkmarkSymbol(completed: Bool) -> String
{
    if(completed)
    {
        return "checkmark.square.fill"
    }else
    {
        return "checkmark.square"
    }
}

func test(notat: Notat)
{
    notat.completed.toggle() //Here is the error "Cannot use mutating member on immutable value: 'notat' is a 'let' constant"
}

1 Ответ

0 голосов
/ 07 августа 2020

Вы можете сделать что-то вроде следующего:

import SwiftUI

struct Notat : Identifiable, Equatable {
    let id = UUID()
    var cost: Int
    var name: String
    var completed: Bool
}

//You should change the name to something more descriptive than ViewModel...
class ViewModel: ObservableObject {
    @Published var modelData = [
        Notat(cost: 50, name: "Klippe plenen", completed: false),
        Notat(cost: 100, name: "Vaske speil", completed: true),
        Notat(cost: 150, name: "Støvsuge huset", completed: false),
        Notat(cost: 50, name: "Vaske bilen", completed: true)
    ]
    
    func setCompleted(for notat: Notat) {
        guard let index = modelData.firstIndex(of: notat) else { return }
        modelData[index].completed.toggle()
    }
}

struct ContentView: View {
    
    @ObservedObject var viewModel = ViewModel()
    
    var body: some View {
        List(viewModel.modelData) { notat in HStack {
            Text("\(notat.cost)kr").frame(width: 50, height: 10, alignment: .leading)
            
            Text(notat.name)
            Button(action: {})
            {
                Image(systemName: self.checkmarkSymbol(completed: notat.completed))
                    .font(Font.system(size: 25, weight: .light))
                    .onTapGesture
                    {
                        self.viewModel.setCompleted(for: notat)
                }
            }.frame(maxWidth: .infinity, alignment: .trailing)
            }
        }
    }
    
    func checkmarkSymbol(completed: Bool) -> String {
        if (completed) {
            return "checkmark.square.fill"
        }
        else {
            return "checkmark.square"
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Таким образом, в основном каждый раз, когда вы нажимаете на изображение, ViewModel будет переключать свойство completed, а поскольку modelData помечено @Publish эти изменения приведут к перезагрузке представления. Здесь подробнее описано ...

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