如何解决使用 if let... 不明白数据来自哪里
我正在 YouTube 上学习斯坦福 CS193 SwiftUI iOS 开发课程,但我很难理解某段代码的工作原理。
import Foundation
struct MemoryGame<CardContent> where CardContent: Equatable {
private(set) var cards: Array<Card>
**private var indexOfTheOneAndOnlyFaceUpCard: Int?**
mutating func choose(_ card: Card) {
if let chosenIndex = cards.firstIndex(where: { $0.id == card.id }),!cards[chosenIndex].isFaceUp,!cards[chosenIndex].isMatched
{
**if let potentialMatchIndex = indexOfTheOneAndOnlyFaceUpCard** {
**if cards[chosenIndex].content == cards[potentialMatchIndex].content** {
cards[chosenIndex].isMatched = true
cards[potentialMatchIndex].isMatched = true
}
indexOfTheOneAndOnlyFaceUpCard = nil
} else {
for index in cards.indices {
cards[index].isFaceUp = false
}
indexOfTheOneAndOnlyFaceUpCard = chosenIndex
}
cards[chosenIndex].isFaceUp.toggle()
}
print("\(cards)")
}
我在我关注的行周围加上了星号。我不明白如何将 cards[chosenIndex].content
与 cards[potentialMatchIndex].content
进行比较,这是因为我不了解 if let potentialMatchIndex = indexOfTheOneAndOnlyFaceUpCard
行是如何工作的。我相信我对可选项以及这段代码的运行方式有一个大致的了解,但我真的不明白 indexOfTheOneAndOnlyFaceUpCard
的数据/值来自哪里。
Here is the video for reference. 他从 1:12:40 开始谈论这些代码行。提前感谢您的任何帮助!
解决方法
在记忆游戏中,回合分两个阶段进行。
-
首先,将一张卡片翻面。
-
然后,用户选择另一张卡片。此时,可能会发生以下两种情况之一:新卡与正面朝上的卡匹配或不匹配。但无论哪种方式,回合都结束了,现在所有的牌都面朝下。
因此,当用户选择一张牌时,如果有一张正面朝上的牌,我们处于回合的中间,我们安排事情,所以有没有面朝上的卡片;回合结束。
但是如果没有面朝上的牌,我们在回合的开始,我们只是把选择的牌面起来等待转弯的第二部分。
所以就跟踪面朝上卡片的变量而言,逻辑是这样的:
var faceupCard : Card? = nil
if let card = faceupCard {
faceupCard = nil
} else {
faceupCard = chosenCard
}
所以这很清楚,当以这种方式削减时:如果卡片面朝上,则使它不是面朝上;如果它不是正面朝上,那就让它正面朝上。
在我看来,您感到困惑的原因是这是一种非常糟糕的代码编写方式。牌面朝上被用作我们是在回合的中间还是在回合的开始的信号。那是可怕的编程。表明我们处于哪个阶段的方法是有一个枚举,它的工作是说明我们处于哪个阶段!当你在编程时,你应该说出你的意思,而不是像这里所做的那样以两种不同的方式使用一个值(既跟踪哪张牌正面朝上,又表明我们在转的哪个阶段).
您可能会感到困惑的另一个原因是,一切都必须根据索引来完成,因为 Card 是一种值类型 (struct)。我们不能循环遍历卡片,也不能直接指向正面朝上的卡片,甚至不能询问卡片是否正面朝上;我们必须循环遍历卡片数组中的索引,并跟踪面朝上卡片的索引。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。