Возможно ли взять элемент из массива структур, а затем добавить его в другой массив в SwiftUI?

Я пытаюсь получить сумму из первого массива, а затем добавить ко второму массиву. Я получил эту ошибку: «Невозможно вызвать инициализатор для типа ForEach‹_, _, _>» со списком аргументов типа «([Number], @escaping (Double) -> ())»

struct Number: Identifiable {
let id = UUID()
let amount: Double
}

struct ContentView: View {

@State var firstArray = [Number(amount: 10),Number(amount: 30),Number(amount: 50)]
@State var secondArray = [Double]()

var body: some View {
    VStack {
        ForEach(firstArray) { row in
            secondArray.append(row.amount)
        }
    }
}
}

person Community    schedule 22.11.2019    source источник
comment
Вероятно, вам следует сделать пользовательскую инициализацию для структуры Number   -  person AlexH    schedule 23.11.2019
comment
Не манипулируйте состоянием просмотра при рендеринге тела   -  person Paulw11    schedule 23.11.2019


Ответы (1)


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

Если вы уверены, что хотите иметь две переменные @State, вы должны инициализировать их отдельно, не меняя их в представлении.

///MARK: - computed property
struct Number: Identifiable {
    let id = UUID()
    let amount: Double
}
struct ContentView: View {
    @State var firstArray = [Number(amount: 10),Number(amount: 30),Number(amount: 50)]
    var secondArray: [Double] = {
        return firstArray.map { $0.amount }
    }

    var body: some View {
        VStack {
//            ForEach(firstArray) { row in
//                secondArray.append(row.amount)
//            }
        }
    }
}

struct Number: Identifiable {
    let id = UUID()
    let amount: Double
}
struct ContentView: View {
    @State var firstArray = [Number(amount: 10),Number(amount: 30),Number(amount: 50)]
    var secondArray = firstArray.map { $0.amount }

    var body: some View {
        VStack {
//            ForEach(firstArray) { row in
//                secondArray.append(row.amount)
//            }
        }
    }
}

struct Number: Identifiable {
    let id = UUID()
    let amount: Double
}
struct ContentView: View {
    @State var firstArray = [Number(amount: 10),Number(amount: 30),Number(amount: 50)]
    @State var secondArray = firstArray.map { $0.amount }

    var body: some View {
        VStack {
//            ForEach(firstArray) { row in
//                secondArray.append(row.amount)
//            }
        }
    }
}

Я настоятельно рекомендую первый вариант, так как он всегда будет иметь amount всего во втором массиве.

person Sam    schedule 23.11.2019