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 ?? "")