import Foundation
struct MemoryGame<CardContent> where CardContent: Equatable {
private(set) var cards: Array<Card>
private var indexOfTheOneAndOnlyMatchCard: Int? {
get {cards.indices.filter({cards[$0].isFaceUp}).oneAndOnly}
set {cards.indices.forEach{cards[$0].isFaceUp = ($0 == newValue)}}
}
mutating func choose(_ card: Card) {
if let chosenIndex = cards.firstIndex(where: { $0.id == card.id }) {
if let potentialMatchIndex = indexOfTheOneAndOnlyMatchCard {
if cards[chosenIndex].content == cards[potentialMatchIndex].content {
cards[chosenIndex].isMatched = true
cards[potentialMatchIndex].isMatched = true
}
cards[chosenIndex].isFaceUp = true
}
else {
indexOfTheOneAndOnlyMatchCard = chosenIndex
}
}
}
init(numberOfPairOfCards: Int, createCardContent: (Int) -> CardContent) {
cards = []
for pairIndex in 0..<numberOfPairOfCards {
let content = createCardContent(pairIndex)
cards.append(Card(content: content, id: pairIndex*2))
cards.append(Card(content: content, id: pairIndex*2+1))
}
}
struct Card: Identifiable {
var isFaceUp = false
var isMatched = false
let content: CardContent
let id: Int
}
}
extension Array {
var oneAndOnly: Element? {
if count == 1 {
return first
} else {
return nil
}
}
}
2022-04-24 拓展extension
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 人生充满各种不确定性 ,谁能保证100%能做好,如果有,那人一定是个骗子 Day 50 S解读论语之Day 34 ...