我正在学习斯坦福 CS193p,一切都很顺利,直到用 HStack 切换 LazyVGrid。
我和一位教授检查了我的代码,他们是一样的。但我的代码令人困惑的部分是,当我的 emojiCount = 4 时,预览效果很好,我可以使用 LazyVGrid,但是当我将 emojiCount 值更改为 4 以上时,例如 5 或 24,它会立即崩溃。
崩溃信息是这样的:
这是我的代码:
import SwiftUI
struct ContentView: View {
var emojis = ["?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?"]
@State var emojiCount = 4
var body: some View {
VStack {
LazyVGrid(columns:[GridItem(),GridItem(),GridItem()]) {
ForEach(emojis[0..<emojiCount], id: \.self) { emoji in
CardView(content: emoji)
}
}
.foregroundColor(.red)
Spacer()
HStack {
remove
Spacer()
add
}
.font(.largeTitle)
.padding(.horizontal)
}
.padding(.horizontal)
}
var remove: some View {
Button {
if emojiCount > 2 {
emojiCount -= 1
}
} label: {
Image(systemName:"minus.circle")
}
}
var add: some View {
Button {
if emojiCount < emojis.count {
emojiCount += 1
}
} label: {
Image(systemName:"plus.circle")
}
}
}
struct CardView: View {
var content: String
@State var isFaceUp: Bool = true
var body: some View {
ZStack {
let shape = RoundedRectangle(cornerRadius: 20)
if isFaceUp {
shape.fill().foregroundColor(.white)
shape.stroke(lineWidth: 3)
Text(content).font(.largeTitle)
} else {
shape.fill()
}
}
.onTapGesture {
isFaceUp = !isFaceUp
}
}
}
我整晚都在试图弄清楚,但我仍然不知道我的代码有什么问题。非常感谢!
答案 0 :(得分:0)
在模拟器中运行代码,你会看到错误
<块引用>致命错误:每个布局项只能出现一次
这导致了表情符号。你有很多,但只有 4 种不同的类型。
在项目由 \.self
引用的循环中,您有责任确保项目是唯一的。