闭包
let faceUpCardIndices = cards.indices.filter({ index in cards[index].isFaceUp })
let faceUpCardIndices = cards.indices.filter({ cards[$0].isFaceUp })
private var indexOfTheOneAndOnlyFaceUpCard: Int? {
get {
var faceUpCardIndices = [Int]()
for index in cards.indices {
if cards[index].isFaceUp {
faceUpCardIndices.append(index)
}
}
if faceUpCardIndices.count == 1 {
return faceUpCardIndices.first
} else {
return nil
}
}
set {
for index in cards.indices {
//if index != indexOfTheOneAndOnlyFaceUpCard {
if index != newValue {
cards[index].isFaceUp = false
} else {
cards[index].isFaceUp = true
}
}
}
}
if faceUpCardIndices.count == 1 {
return faceUpCardIndices.first
} else {
return nil
}
------
extension Array {
var oneAndOnly: Element? {
if count == 1 {
return first
} else {
return nil
}
}
}
MemoryGame.swift --------------
import Foundation
struct MemoryGame<CardContent> where CardContent: Equatable {
private(set) var cards: Array<Card>
private var indexOfTheOneAndOnlyFaceUpCard: 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 }),
!cards[chosenIndex].isMatched,
!cards[chosenIndex].isFaceUp
{
if let potentialIndex = indexOfTheOneAndOnlyFaceUpCard {
if cards[chosenIndex].content == cards[potentialIndex].content {
cards[chosenIndex].isMatched = true
cards[potentialIndex].isMatched = true
}
cards[chosenIndex].isFaceUp = true
// indexOfTheOneAndOnlyFaceUpCard = nil
} else {
for index in cards.indices {
cards[index].isFaceUp = false
}
indexOfTheOneAndOnlyFaceUpCard = 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
}
}
}
网友评论