Home > Blockchain >  SwiftUI app keeps crashing probably due to ForEach
SwiftUI app keeps crashing probably due to ForEach

Time:09-16

I was trying to create a Tic-Tac-Toe game using SwiftUI, but Simulator crashes whenever I try to get the code to run. Here's my code:

import SwiftUI

struct ContentView: View {
    @State private var allMarks: Array? = [nil, nil, nil, nil, nil, nil, nil, nil, nil]
    var body: some View {
        HStack(content: {
            ForEach(1..<3) { i in
                VStack(content: {
                    ForEach(1..<3) { i in
                        ZStack(content: {
                            RoundedRectangle(cornerRadius: 12.0, style: .continuous)
                                .aspectRatio(contentMode: .fit)
                                .foregroundColor(Color(UIColor.systemGroupedBackground))
                                .onTapGesture {
                                    if allMarks?[i] == nil {
                                        allMarks?[i] = "circle"
                                        var randomCell = allMarks?.randomElement()
                                        repeat {
                                            randomCell = allMarks?.randomElement()
                                        } while randomCell == nil
                                        randomCell = "xmark"
                                    }
                                }
                            Image(systemName: allMarks?[i] as! String)
                        })
                    }
                })
            }
        })
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

I tried removing ForEach and pasting the contents of the ZStack other two times and then pasting said ZStack again twice and it didn't crash, so I assume it's ForEach that caused the problem. I'm not sure thought as it crashed a few times, too, even after I completely removed ForEach. Can anyone help me figure out what's wrong and what I could do to fix it?

CodePudding user response:

This is what causes your code to crash:

Image(systemName: allMarks?[i] as! String)

You're downcasting an optional value that returns nil.

To resolve this you need to make sure the value is a String first and then you can use it safely in your Image view.

So change that to:

if let imageName = allMarks?[i] as? String {
    Image(systemName: imageName)
}

More information, checkout https://developer.apple.com/swift/blog/?id=23

CodePudding user response:

Change your Image with below code, because you try to unwrap a nil value as! String so that App crashes. If you define it may be nil and give a default String that isn't assigned to any SF Symbol, it will be empty.

Image(systemName: allMarks?[i] as? String ?? "")
  • Related