เป็นไปได้ไหมที่จะนำไอเท็มจากอาร์เรย์ struct แล้วต่อท้ายอาร์เรย์อื่นใน SwiftUI

ฉันกำลังพยายามรับจำนวนเงินจาก firstArray จากนั้นจึงผนวกเข้ากับ SecondArray ฉันได้รับข้อผิดพลาดนี้: "ไม่สามารถเรียกใช้ตัวเริ่มต้นสำหรับประเภท '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 ถือเป็นแหล่งที่มาของความจริง หากอาร์เรย์ที่สองของคุณขึ้นอยู่กับอาร์เรย์แรกของคุณเสมอ ก็ไม่ควรจะเป็นตัวแปรสถานะ (อาจเป็นคุณสมบัติที่คำนวณได้โดยใช้ map ดังที่แสดงด้านล่าง)

หากคุณแน่ใจว่าคุณต้องการมีตัวแปร @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)
//            }
        }
    }
}

ฉันขอแนะนำตัวเลือกแรกอย่างยิ่ง เนื่องจากมันจะมี amounts ของทุกสิ่งในอาร์เรย์ที่สองเสมอ

person Sam    schedule 23.11.2019