SwiftUI ForEach Type '_' ไม่มีสมาชิก 'id'

เมื่อฉันใช้มุมมองแบบกำหนดเองใน ForEach ฉันได้รับข้อผิดพลาดประเภท '_' ไม่มีสมาชิก 'id' เมื่อฉันใช้ Text(item.x) แทนมุมมองที่กำหนดเอง มันจะคอมไพล์และใช้งานได้ ฉันพลาดอะไรไป?

@State private var showTargets = [
    (id: 1, state: false, x: 109.28, y: 109.28),
    (id: 2, state: false, x: 683, y: 109.28),
    (id: 3, state: false, x: 1256.72, y: 109.28)
]

...

var body: some View {
    Group {

        ForEach(showTargets, id: \.id) { item in
            Text(String(item.x))
            // Using CustomView(x: item.x, y: item.y, f: {}) instead does not work
        }
}

มุมมองที่กำหนดเอง:

struct CustomView : View {

    @State private var color = Color.white
    @State private var animate = false


    internal var x: CGFloat
    internal var y: CGFloat
    internal var f: ()->()
    internal let w: CGFloat = 60
    internal let h: CGFloat = 60

    private let width = -1366/2
    private let height = -1024/2

    var body: some View {
        Button(action: {
            self.animate.toggle()
            if self.color == Color.green {
                self.color = Color.white
            }
            else {
                self.color = Color.green
                self.f()
            }
        }, label: {
            Ellipse()
                .fill(self.color)
                .scaleEffect(self.animate ? 1.2 : 1)
                .animation(Animation.easeInOut)

        }).position(x: self.x + self.w/2, y: self.y + self.h/2)
            .frame(width: self.w, height: self.h, alignment: .center)
            .offset(CGSize(width: self.width, height: self.height))

    }
}

person krjw    schedule 19.07.2019    source แหล่งที่มา


คำตอบ (1)


คุณกำลังพยายามเริ่มต้น CustomView ของคุณด้วยประเภทที่ไม่ถูกต้อง (Double แทนที่จะเป็น CGFloat)

เครื่องมือเริ่มต้น CustomView ของคุณมีลักษณะดังนี้:

init(x: CGFloat, y: CGFloat, f: () -> Void)

และคุณเรียกมันโดยใช้ค่า showTargets tuple ซึ่งก็คือ:

(id: Int, state: Bool, x: Double, y: Double)

ดังนั้นเมื่อคุณทำสิ่งนี้:

CustomView(x: item.x, y: item.y, f: {})

คุณกำลังระบุค่า Double (สำหรับ x และ y) แทนที่จะเป็น CGFloat เนื่องจากการส่งจาก Double ถึง CGFloat ไม่สามารถบอกเป็นนัยได้ คุณจึงต้องดำเนินการอย่างชัดเจน:

CustomView(x: CGFloat(item.x), y: CGFloat(item.y), f: {})
person rraphael    schedule 19.07.2019
comment
แก้ไขแล้ว ขอบคุณ! ข้อความแสดงข้อผิดพลาดที่เป็นความลับมากและอย่างไรก็ตาม ในกรณีอื่นๆ ฉันไม่จำเป็นต้องส่งไปที่ CGFloat - person krjw; 19.07.2019
comment
มีประโยชน์สุดๆ! ขอบคุณ! - person Aaron; 28.04.2020