1

SwiftUI Question. I have this code that gives me the error “The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions”. The error is because of the feeling.selected.toggle(). myFeelings is a ObservableObject Class that contains an array of Feeling which is a struct. I want to be able to change the selected property to true or false when pressing the button and update the view. I don’t know if somebody can help me, I am new with coding in general.

ForEach(myFeelings.feelings.indices) { index in
                    ZStack {
                        Button(action: {
                            self.myFeelings.feelings[index].selected.toggle()
                            print("A")
                        }) {
                            Text(self.myFeelings.feelings[index].emoji)
                                .font(.system(size: 40))
                        }
                        Text(String(self.myFeelings.feelings[index].selected))
                        .font(.system(size: 10))
                    }
                }

This is the part I want to update with the selected feelings.

ForEach(myFeelings.feelings.indices) { index in
                        Group {
                            if self.myFeelings.feelings[index].selected {
                            ZStack {

                                        Rectangle()
                                        .frame(height: 100)
                                            .foregroundColor(self.myFeelings.feelings[index].color)
                                        .scaledToFill()
                                    }

                            }
                        }

                    }

Here is the array:

    @State var myFeelings = Feelings(feelings:[Feeling(feeling: "Joy", emoji: "😂", color:  Color(#colorLiteral(red: 0.9607843137254902, green: 0.7058823529411765, blue: 0.2, alpha: 1.0))),
        Feeling(feeling: "Trust", emoji: "😌", color: Color(#colorLiteral(red: 0.4666666666666667, green: 0.7647058823529411, blue: 0.26666666666666666, alpha: 1.0))),
        Feeling(feeling: "Fear", emoji: "😰", color: Color(#colorLiteral(red: 0.27450980392156865, green: 0.48627450980392156, blue: 0.1411764705882353, alpha: 1.0))),
        Feeling(feeling: "Surprise", emoji: "😮", color: Color(#colorLiteral(red: 0.12941176470588237, green: 0.21568627450980393, blue: 0.06666666666666667, alpha: 1.0))),
        Feeling(feeling: "Sadness", emoji: "😢", color: Color(#colorLiteral(red: 0.17647058823529413, green: 0.4980392156862745, blue: 0.7568627450980392, alpha: 1.0))),
        Feeling(feeling: "Disgust", emoji: "🤮", color: Color(#colorLiteral(red: 0.12156862745098039, green: 0.011764705882352941, blue: 0.4235294117647059, alpha: 1.0))),
        Feeling(feeling: "Anger", emoji: "😡", color: Color(#colorLiteral(red: 0.7450980392156863, green: 0.1568627450980392, blue: 0.07450980392156863, alpha: 1.0))),
        Feeling(feeling: "Anticipation", emoji: "😏", color: Color(#colorLiteral(red: 0.9372549019607843, green: 0.34901960784313724, blue: 0.19215686274509805, alpha: 1.0)))])

Feeling and Feelings are Structures

1 Answer 1

1

Use indices in your foreach, and declare myFeelings with @State, here is a full working example:

struct FeelingGroup {
    var feelings: [Feeling]
}

struct Feeling {
    var selected: Bool
    var emoji: String
}
struct ToggleView: View {
    @State var myFeelings = FeelingGroup(feelings: [Feeling(selected: true, emoji: "A"),
                                                    Feeling(selected: true, emoji: "B"),
                                                    Feeling(selected: false, emoji: "C")])
    var body: some View {
        VStack{
            ForEach(myFeelings.feelings.indices) { index in
                HStack {
                    Button(action: {
                        self.myFeelings.feelings[index].selected.toggle()
                        print("A")
                    }) {
                        Text(self.myFeelings.feelings[index].emoji)
                            .font(.system(size: 40))
                    }
                    Text(String(self.myFeelings.feelings[index].selected))
                    .font(.system(size: 40))
                }
            }
        }
    }
}

struct ToggleView_Previews: PreviewProvider {
    static var previews: some View {
        ToggleView()
    }
}
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you, this removes the error but doesn't update the view. I need to update the view to display the selected feelings in the array in another forEach I have.
What behavior are you expecting with your second ForEach? If you just want to show something try replacing Group with a VStack or HStack

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.