Apakah mungkin untuk mengambil item dari array struct dan kemudian menambahkan ke array berbeda di SwiftUI?

Saya mencoba mendapatkan jumlah dari Array pertama, lalu menambahkan ke Array kedua. Saya mendapatkan kesalahan ini: "Tidak dapat memanggil penginisialisasi untuk tipe 'ForEach‹_, _, _>' dengan daftar argumen tipe '([Nomor], @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 sumber
comment
Anda mungkin harus membuat inisialisasi khusus untuk Number struct   -  person AlexH    schedule 23.11.2019
comment
Jangan memanipulasi status tampilan saat merender isi   -  person Paulw11    schedule 23.11.2019


Jawaban (1)


Apa pun yang bertanda @State adalah sumber kebenaran. Jika larik kedua Anda selalu bergantung pada larik pertama, larik tersebut tidak boleh berupa variabel status (bisa berupa properti yang dihitung menggunakan peta, seperti terlihat di bawah).

Jika Anda yakin ingin memiliki dua variabel @State, Anda harus menginisialisasinya secara terpisah, bukan mengubahnya dalam tampilan.

///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)
//            }
        }
    }
}

Saya sangat merekomendasikan opsi pertama, karena opsi ini akan selalu memiliki amounts dari semua yang ada di array kedua.

person Sam    schedule 23.11.2019