get set 干干净净
函数式编程 拓展
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
} else {
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
var content: CardContent
var id: Int
}
}
extension Array {
var oneAndOnly: Element? {
if count == 1 {
return first
} else {
return nil
}
}
}
get set
import Foundation
struct MemoryGame<CardContent> where CardContent: Equatable {
private(set) var cards: Array<Card>
private var indexOfTheOneAndOnlyFaceUpCard: Int? {
get {
var faceUpCardsIndices = [Int]()
for index in cards.indices {
if cards[index].isFaceUp {
faceUpCardsIndices.append(index)
}
}
if faceUpCardsIndices.count == 1 {
return faceUpCardsIndices.first
} else {
return nil
}
}
set {
for index in cards.indices {
if index != indexOfTheOneAndOnlyFaceUpCard {
cards[index].isFaceUp = false
} else {
cards[index].isFaceUp = true
}
}
}
}
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
} else {
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
var content: CardContent
var id: Int
}
}
indexOfTheOneAndOnlyFaceUpCard 计算属性
import Foundation
struct MemoryGame<CardContent> where CardContent: Equatable {
private(set) var cards: Array<Card>
private var indexOfTheOneAndOnlyFaceUpCard: Int? {
var faceUpCardsIndices = [Int]()
//把朝上卡的index做一个数组
for index in cards.indices {
if cards[index].isFaceUp {
faceUpCardsIndices.append(index)
}
}
//如果数组有一个数
if faceUpCardsIndices.count == 1 {
//返回数组中第一个数的index
return faceUpCardsIndices.first
} else {
return nil
}
}
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
}
//匹配上之后唯一朝上的卡就没有了
indexOfTheOneAndOnlyFaceUpCard = nil
} else {
//没匹配上,所有卡都朝下
for index in cards.indices {
cards[index].isFaceUp = false
}
//唯一朝上的卡就是选中卡
indexOfTheOneAndOnlyFaceUpCard = chosenIndex
}
cards[chosenIndex].isFaceUp.toggle()
}
}
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
var content: CardContent
var id: Int
}
}
匹配逻辑--------------
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].isMatched,
!cards[chosenIndex].isFaceUp
{
if let potentialIndex = indexOfTheOneAndOnlyFaceUpCard {
if cards[chosenIndex].content == cards[potentialIndex].content {
cards[chosenIndex].isMatched = true
cards[potentialIndex].isMatched = true
}
indexOfTheOneAndOnlyFaceUpCard = nil
} else {
for index in cards.indices {
cards[index].isFaceUp = false
}
indexOfTheOneAndOnlyFaceUpCard = chosenIndex
}
cards[chosenIndex].isFaceUp.toggle()
}
}
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
var content: CardContent
var id: Int
}
}
----------
网友评论