Обновление переменной @State (Int Counter) с помощью кнопки ForEach невозможно? - PullRequest
0 голосов
/ 08 июля 2019

Попытка обновить счетчик итерацией по кнопке ForEach, но при этом в Xcode 11 появляется следующая ошибка:

Невозможно преобразовать значение типа> 'ForEach,> _ModifiedContent) >>,> PaddingLayout >> 'для закрытия типа результата' '

Попытка добавить @State, но все еще не удается обновить счет в var characterList

import SwiftUI

struct CharacterSelection:Identifiable {
    var id: Int
    var name : String
    var count: Int
}
import SwiftUI

struct ContentView : View {

    @State var charactersList = [
        CharacterSelection(id: 0, name: "Witch", count: 0),
        CharacterSelection(id: 1, name: "Seer", count: 1),
        CharacterSelection(id: 2, name: "Hunter", count: 0),
        CharacterSelection(id: 3, name: "Knight", count: 0)
    ]


    var body: some View {

        VStack(alignment:.leading) {
            ForEach(charactersList.identified(by: \.id)) {character in
                HStack{
                    Text(character.name)
                    Spacer()
                    Text("\(character.count) 

                    Button(action: { character.count += 1 }) {
                        Text("Button")
                    }

                }.padding(10)
            }
        }
    }
}

Количествов соответствующем индексе в var CharacterList должен нажиматься + = 1 при нажатии кнопки.

1 Ответ

0 голосов
/ 08 июля 2019

Обратите внимание, что и Arrays, и CharacterSelection имеют тип Значение , а не Ссылка . Если вы не знаете разницу, проверьте эту страницу: https://developer.apple.com/swift/blog/?id=10

Чтобы ваш код работал, вы можете переписать его так:

struct ContentView : View {

    @State var charactersList = [
        CharacterSelection(id: 0, name: "Witch", count: 0),
        CharacterSelection(id: 1, name: "Seer", count: 1),
        CharacterSelection(id: 2, name: "Hunter", count: 0),
        CharacterSelection(id: 3, name: "Knight", count: 0)
    ]


    var body: some View {

        VStack(alignment:.leading) {
            ForEach(0..<charactersList.count) { i in
                HStack{
                    Text(self.charactersList[i].name)
                    Spacer()
                    Text("\(self.charactersList[i].count)")

                    Button(action: { self.charactersList[i].count += 1 }) {
                        Text("Button")
                    }

                }.padding(10)
            }

            Button(action: {
                self.charactersList.append(CharacterSelection(id: self.charactersList.count, name: "something", count: 0))
            }, label: {
                Text("Add CharacterSelection")
            })

        }
    }
}
...