美文网首页
2021-09-28 计算属性

2021-09-28 计算属性

作者: 脑子 | 来源:发表于2021-09-28 04:54 被阅读0次

    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
        }
    }
    

    ----------

    相关文章

      网友评论

          本文标题:2021-09-28 计算属性

          本文链接:https://www.haomeiwen.com/subject/pvrlnltx.html