แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ Swift-แƒจแƒ˜

แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ Swift-แƒจแƒ˜

แƒ”แƒก แƒกแƒขแƒแƒขแƒ˜แƒ แƒแƒฆแƒฌแƒ”แƒ แƒก แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒ•แƒแƒ แƒฏแƒ˜แƒจแƒ แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ›แƒฌแƒแƒœแƒก. แƒ’แƒแƒ แƒ“แƒ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ แƒแƒ› แƒ—แƒแƒ•แƒ˜แƒกแƒ—แƒแƒ•แƒแƒ“ แƒ™แƒแƒ แƒ’แƒ˜แƒ, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒ˜แƒ’แƒ”แƒ‘แƒ— แƒชแƒแƒขแƒ แƒ›แƒ”แƒขแƒก Swift-แƒ˜แƒก แƒ™แƒšแƒแƒกแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘. แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒœแƒแƒ› แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ—, แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒ˜แƒ’แƒแƒ— แƒ—แƒแƒ•แƒแƒ“ แƒ—แƒแƒ›แƒแƒจแƒ˜.

แƒจแƒ”แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ—: "Habr"-แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก - แƒคแƒแƒกแƒ“แƒแƒ™แƒšแƒ”แƒ‘แƒ 10 แƒ แƒฃแƒ‘แƒšแƒ˜แƒ“แƒแƒœ Skillbox-แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ™แƒฃแƒ แƒกแƒ–แƒ” แƒฉแƒแƒ แƒ˜แƒชแƒฎแƒ•แƒ˜แƒกแƒแƒก "Habr" แƒกแƒแƒ แƒ”แƒ™แƒšแƒแƒ›แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

Skillbox แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ—: แƒกแƒแƒ’แƒแƒœแƒ›แƒแƒœแƒแƒ—แƒšแƒ”แƒ‘แƒšแƒ แƒแƒœแƒšแƒแƒ˜แƒœ แƒ™แƒฃแƒ แƒกแƒ˜ "แƒžแƒ แƒแƒคแƒ”แƒกแƒ˜แƒ Java Developer".

แƒ แƒแƒ’แƒแƒ  แƒ•แƒ˜แƒ—แƒแƒ›แƒแƒจแƒแƒ— แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒ˜

แƒ—แƒแƒ›แƒแƒจแƒ˜ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ”แƒ›แƒแƒœแƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—. แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒžแƒ˜แƒ แƒฅแƒ•แƒ” แƒฌแƒ”แƒ•แƒ”แƒœ (แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“, แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒฅแƒ•แƒ”แƒ›แƒแƒ—). แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒ›แƒ”แƒ–แƒ” แƒ“แƒแƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ‘แƒ—, แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒ˜แƒฎแƒกแƒœแƒ”แƒ‘แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒฌแƒแƒ›แƒ˜แƒ—.

แƒ›แƒแƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒแƒ›แƒแƒชแƒแƒœแƒแƒ แƒ˜แƒžแƒแƒ•แƒแƒ— แƒงแƒ•แƒ”แƒšแƒ แƒ‘แƒแƒ แƒแƒ—แƒ˜ แƒ”แƒ แƒ—แƒ˜ แƒ“แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒ—. แƒ—แƒฃ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ™แƒแƒ แƒขแƒ˜แƒก แƒ’แƒแƒฎแƒกแƒœแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ›แƒ”แƒแƒ แƒ”แƒก แƒ’แƒแƒ“แƒแƒแƒขแƒ แƒ˜แƒแƒšแƒ”แƒ‘แƒ— แƒ“แƒ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ, แƒแƒ แƒ˜แƒ•แƒ” แƒ™แƒแƒ แƒขแƒ˜ แƒฆแƒ˜แƒ แƒ แƒฉแƒ”แƒ‘แƒ. แƒ—แƒฃ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒแƒ  แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ, แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ แƒ™แƒ•แƒšแƒแƒ• แƒ˜แƒฎแƒฃแƒ แƒ”แƒ‘แƒ. แƒ›แƒ˜แƒ–แƒแƒœแƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ แƒ˜แƒก แƒ’แƒแƒฎแƒกแƒœแƒแƒ.

แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ

แƒแƒ› แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“ แƒ“แƒแƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜:

  • แƒ”แƒ แƒ—แƒ˜ แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ แƒ˜: GameController.swift.
  • แƒ”แƒ แƒ—แƒ˜ แƒฎแƒ”แƒ“แƒ˜: CardCell.swift.
  • แƒแƒ แƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ˜: MemoryGame.swift แƒ“แƒ Card.swift.
  • Main.storyboard แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ—แƒ”แƒšแƒ˜ แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒแƒ‘แƒ˜แƒก แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒกแƒแƒงแƒแƒคแƒแƒ“.

แƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ— แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒกแƒ˜ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ˜แƒ—, แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒ—.

แƒ‘แƒแƒ แƒแƒ—แƒ˜.แƒกแƒ•แƒ˜แƒคแƒขแƒ˜

แƒ‘แƒแƒ แƒแƒ—แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒก แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒกแƒแƒ›แƒ˜ แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ: id แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜แƒก แƒ˜แƒ“แƒ”แƒœแƒขแƒ˜แƒคแƒ˜แƒชแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ˜ แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜ แƒ‘แƒแƒ แƒแƒ—แƒ˜แƒก แƒกแƒขแƒแƒขแƒฃแƒกแƒ˜แƒก แƒ“แƒแƒกแƒแƒ–แƒฃแƒกแƒขแƒ”แƒ‘แƒšแƒแƒ“ (แƒ“แƒแƒ›แƒแƒšแƒฃแƒšแƒ˜ แƒแƒœ แƒฆแƒ˜แƒ) แƒ“แƒ artworkURL แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ–แƒ” แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

class Card {        
    var id: String    
    var shown: Bool = false    
    var artworkURL: UIImage!
}

แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒ“แƒแƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒ”แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜ แƒ แƒฃแƒ™แƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ‘แƒšแƒแƒ“:

แƒ‘แƒแƒ แƒแƒ—แƒ–แƒ” แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜. แƒแƒฅ แƒฉแƒ•แƒ”แƒœ แƒแƒฆแƒ•แƒแƒ“แƒ’แƒ”แƒœแƒ— แƒงแƒ•แƒ”แƒšแƒ แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒแƒก แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒแƒ“. id-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ— id-แƒก NSUUIS().uuidString-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒ—.

init(image: UIImage) {        
    self.id = NSUUID().uuidString        
    self.shown = false        
    self.artworkURL = image    
}

แƒžแƒ˜แƒ แƒแƒ“แƒแƒ‘แƒ˜แƒก แƒ›แƒแƒฌแƒ›แƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜.

func equals(_ card: Card) -> Bool {
    return (card.id == id)    
}

แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ‘แƒแƒ แƒแƒ—แƒ˜แƒก แƒแƒกแƒšแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ - แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒฃแƒคแƒ แƒ แƒ“แƒ˜แƒ“แƒ˜ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒ˜แƒ“แƒ”แƒœแƒขแƒฃแƒ แƒ˜. แƒ”แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ“แƒแƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ‘แƒแƒ แƒแƒ—แƒก แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒ—.

func copy() -> Card {        
    return Card(card: self)    
}
 
init(card: Card) {        
    self.id = card.id        
    self.shown = card.shown        
    self.artworkURL = card.artworkURL    
}

แƒ“แƒ แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒ แƒกแƒแƒญแƒ˜แƒ แƒ แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ”แƒ‘แƒแƒ“ แƒแƒกแƒแƒ แƒ”แƒ•แƒแƒ“. แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒ›แƒแƒก Array แƒ™แƒšแƒแƒกแƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒแƒก.

extension Array {    
    mutating func shuffle() {        
        for _ in 0...self.count {            
            sort { (_,_) in arc4random() < arc4random() }        
        }   
    }
}

แƒ“แƒ แƒแƒฅ แƒแƒ แƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ แƒงแƒ•แƒ”แƒšแƒ แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ˜แƒ—แƒ แƒ“แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒ—.

class Card {
    
    var id: String
    var shown: Bool = false
    var artworkURL: UIImage!
    
    static var allCards = [Card]()
 
    init(card: Card) {
        self.id = card.id
        self.shown = card.shown
        self.artworkURL = card.artworkURL
    }
    
    init(image: UIImage) {
        self.id = NSUUID().uuidString
        self.shown = false
        self.artworkURL = image
    }
    
    func equals(_ card: Card) -> Bool {
        return (card.id == id)
    }
    
    func copy() -> Card {
        return Card(card: self)
    }
}
 
extension Array {
    mutating func shuffle() {
        for _ in 0...self.count {
            sort { (_,_) in arc4random() < arc4random() }
        }
    }
}

แƒฌแƒแƒ•แƒ˜แƒ“แƒ”แƒ— แƒฌแƒ˜แƒœ.

แƒ›แƒ”แƒแƒ แƒ” แƒ›แƒแƒ“แƒ”แƒšแƒ˜ แƒแƒ แƒ˜แƒก MemoryGame, แƒแƒฅ แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒ”แƒ— 4*4 แƒ‘แƒแƒ“แƒ”. แƒ›แƒแƒ“แƒ”แƒšแƒก แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒ˜แƒกแƒ”แƒ—แƒ˜ แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ (แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒ˜แƒ•แƒ˜ แƒ‘แƒแƒ“แƒ”แƒ–แƒ”), แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜แƒ แƒ›แƒแƒกแƒ˜แƒ•แƒ˜ แƒ™แƒแƒ แƒขแƒ”แƒ‘แƒ˜แƒ— แƒฃแƒ™แƒ•แƒ” แƒ’แƒแƒฎแƒกแƒœแƒ˜แƒšแƒ˜ แƒ“แƒ แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ˜ แƒแƒ แƒ˜แƒก Playing แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒกแƒขแƒแƒขแƒฃแƒกแƒ˜แƒก แƒ—แƒ•แƒแƒšแƒงแƒฃแƒ แƒ˜แƒก แƒ“แƒ”แƒ•แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

class MemoryGame {        
    var cards:[Card] = [Card]()    
    var cardsShown:[Card] = [Card]()    
    var isPlaying: Bool = false
}

แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ•แƒ˜แƒ›แƒฃแƒจแƒแƒแƒ— แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜ แƒฅแƒกแƒ”แƒšแƒ—แƒแƒœ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ‘แƒšแƒแƒ“.

แƒ›แƒ”แƒ—แƒแƒ“แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ แƒ”แƒ•แƒก แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒก แƒ‘แƒแƒ“แƒ”แƒจแƒ˜.

func shuffleCards(cards:[Card]) -> [Card] {       
    var randomCards = cards        
    randomCards.shuffle()                
 
    return randomCards    
}

แƒแƒฎแƒแƒšแƒ˜ แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜. แƒแƒฅ แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒ•แƒฃแƒฌแƒแƒ“แƒ”แƒ‘แƒ— แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ›แƒ”แƒ—แƒแƒ“แƒก แƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ”แƒ‘แƒแƒ“ แƒ“แƒ isPlaying แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒแƒก true-แƒ–แƒ”.

func newGame(cardsArray:[Card]) -> [Card] {       
    cards = shuffleCards(cards: cardsArray)        
    isPlaying = true            
 
    return cards    
}

แƒ—แƒฃ แƒ’แƒ•แƒกแƒฃแƒ แƒก แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ•แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ— isPlaying แƒชแƒ•แƒšแƒแƒ“แƒก false-แƒ–แƒ” แƒ“แƒ แƒ•แƒฎแƒกแƒœแƒ˜แƒ— แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒแƒก.

func restartGame() {        
    isPlaying = false                
    cards.removeAll()        
    cardsShown.removeAll()    
}

แƒ“แƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜. แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ—.

func cardAtIndex(_ index: Int) -> Card? {        
    if cards.count > index {            
        return cards[index]        
    } else {            
        return nil        
    }    
}

แƒ›แƒ”แƒ—แƒแƒ“แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒ‘แƒแƒ แƒแƒ—แƒ˜แƒก แƒžแƒแƒ–แƒ˜แƒชแƒ˜แƒแƒก.

func indexForCard(_ card: Card) -> Int? {        
    for index in 0...cards.count-1 {            
        if card === cards[index] {                
            return index            
        }      
    }
        
    return nil    
}

แƒแƒ แƒฉแƒ”แƒฃแƒšแƒ˜ แƒ‘แƒแƒ แƒแƒ—แƒ˜แƒก แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒ—แƒแƒœ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ.

func unmatchedCardShown() -> Bool {
    return cardsShown.count % 2 != 0
}

แƒ”แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒแƒ‘แƒก แƒ‘แƒแƒšแƒ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒก **cardsShown** แƒ›แƒแƒกแƒ˜แƒ•แƒจแƒ˜ แƒ“แƒ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒจแƒ”แƒฃแƒกแƒแƒ‘แƒแƒ›แƒ แƒ‘แƒแƒ แƒแƒ—แƒก.

func didSelectCard(_ card: Card?) {        
    guard let card = card else { return }                
    
    if unmatchedCardShown() {            
        let unmatched = unmatchedCard()!                        
        
        if card.equals(unmatched) {          
            cardsShown.append(card)            
        } else {                
            let secondCard = cardsShown.removeLast()      
        }                    
    } else {            
        cardsShown.append(card)        
    }                
    
    if cardsShown.count == cards.count {            
        endGame()        
    }    
}

Main.storyboard แƒ“แƒ GameController.swift

Main.storyboard แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ Swift-แƒจแƒ˜

แƒ—แƒแƒ•แƒ“แƒแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒงแƒ”แƒœแƒแƒ— แƒแƒฎแƒแƒšแƒ˜ แƒ—แƒแƒ›แƒแƒจแƒ˜, แƒ แƒแƒ’แƒแƒ แƒช viewDidLoad แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ แƒจแƒ˜, แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒฉแƒแƒ—แƒ•แƒšแƒ˜แƒ—. แƒ—แƒแƒ›แƒแƒจแƒจแƒ˜ แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ 4*4 collectionView-แƒ˜แƒ—. แƒ—แƒฃ แƒฏแƒ”แƒ  แƒแƒ  แƒ˜แƒชแƒœแƒแƒ‘แƒ— collectionView-แƒก, แƒแƒฅ แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ.

แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒ”แƒ‘แƒ— GameController-แƒก, แƒ แƒแƒ’แƒแƒ แƒช แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก root แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ แƒก. GameController-แƒก แƒ”แƒฅแƒœแƒ”แƒ‘แƒ collectionView, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ•แƒ›แƒแƒ แƒ—แƒแƒ•แƒ— แƒ แƒแƒ’แƒแƒ แƒช IBOutlet. แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ แƒแƒ แƒ˜แƒก IBAction onStartGame() แƒฆแƒ˜แƒšแƒแƒ™แƒ˜, แƒ”แƒก แƒแƒ แƒ˜แƒก UIButton, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒฎแƒ˜แƒšแƒแƒ— แƒกแƒชแƒ”แƒœแƒแƒ แƒ˜แƒก แƒ“แƒแƒคแƒแƒ–แƒ”, แƒกแƒแƒฎแƒ”แƒšแƒแƒ“ PLAY.

แƒชแƒแƒขแƒ แƒ แƒแƒ› แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘:

  • แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒแƒ  แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒก - แƒ‘แƒแƒ“แƒ”แƒก: game = MemoryGame() แƒ“แƒ แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜: แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ = [Card]().
  • แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒ”แƒ— แƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒช viewDidLoad, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ›แƒแƒ˜แƒซแƒแƒฎแƒ”แƒ‘แƒ แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒแƒก.
  • collectionView แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ“แƒแƒ›แƒแƒšแƒฃแƒšแƒแƒ“, แƒ แƒแƒ“แƒ’แƒแƒœ แƒงแƒ•แƒ”แƒšแƒ แƒ‘แƒแƒ แƒแƒ—แƒ˜ แƒ˜แƒ›แƒแƒšแƒ”แƒ‘แƒ แƒ›แƒแƒœแƒแƒ›, แƒกแƒแƒœแƒแƒ› แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒแƒ  แƒ“แƒแƒแƒญแƒ”แƒ แƒก PLAY-แƒก.
  • แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒ˜ PLAY-แƒก แƒ“แƒแƒ•แƒแƒญแƒ”แƒ แƒ—, แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ onStartGame IBAction แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ แƒ“แƒ แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒ”แƒ— collectView isHidden แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ false-แƒ–แƒ”, แƒ แƒแƒ—แƒ แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ แƒ’แƒแƒฎแƒ“แƒ”แƒก แƒฎแƒ˜แƒšแƒฃแƒšแƒ˜.
  • แƒงแƒแƒ•แƒ”แƒš แƒฏแƒ”แƒ แƒ–แƒ”, แƒ แƒแƒชแƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒ แƒฉแƒ”แƒ•แƒก แƒ‘แƒแƒ แƒแƒ—แƒก, แƒ˜แƒฌแƒแƒ“แƒ”แƒ‘แƒ didSelectItemAt แƒ›แƒ”แƒ—แƒแƒ“แƒ˜. แƒ›แƒ”แƒ—แƒแƒ“แƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ•แƒฃแƒฌแƒแƒ“แƒ”แƒ‘แƒ— didSelectCard-แƒก แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒšแƒแƒ’แƒ˜แƒ™แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒšแƒแƒ“.

แƒแƒฅ แƒแƒ แƒ˜แƒก GameController-แƒ˜แƒก แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ:

class GameController: UIViewController {
 
    @IBOutlet weak var collectionView: UICollectionView!
    
    let game = MemoryGame()
    var cards = [Card]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        game.delegate = self
        
        collectionView.dataSource = self
        collectionView.delegate = self
        collectionView.isHidden = true
        
        APIClient.shared.getCardImages { (cardsArray, error) in
            if let _ = error {
                // show alert
            }
            
            self.cards = cardsArray!
            self.setupNewGame()
        }
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        
        if game.isPlaying {
            resetGame()
        }
    }
    
    func setupNewGame() {
        cards = game.newGame(cardsArray: self.cards)
        collectionView.reloadData()
    }
    
    func resetGame() {
        game.restartGame()
        setupNewGame()
    }
    
    @IBAction func onStartGame(_ sender: Any) {
        collectionView.isHidden = false
    }
}
 
// MARK: - CollectionView Delegate Methods
extension GameController: UICollectionViewDelegate, UICollectionViewDataSource {
    
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return cards.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CardCell", for: indexPath) as! CardCell
        cell.showCard(false, animted: false)
        
        guard let card = game.cardAtIndex(indexPath.item) else { return cell }
        cell.card = card
        
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath) as! CardCell
        
        if cell.shown { return }
        game.didSelectCard(cell.card)
        
        collectionView.deselectItem(at: indexPath, animated:true)
    }
}

แƒแƒฎแƒšแƒ แƒ›แƒแƒ“แƒ˜แƒ— แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒแƒ— แƒชแƒแƒขแƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœ แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ”แƒ‘แƒ–แƒ”.

แƒแƒฅแƒ›แƒ”แƒ‘แƒ˜

แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒแƒ แƒ˜แƒก Swift-แƒ˜แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ˜. แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ”แƒ‘แƒ˜ แƒ˜แƒซแƒšแƒ”แƒ•แƒ แƒ™แƒšแƒแƒกแƒ˜แƒก, แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒแƒœ แƒฉแƒแƒ›แƒแƒ—แƒ•แƒšแƒ˜แƒก แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒแƒก. แƒ”แƒก แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒ›แƒแƒ“แƒฃแƒšแƒฃแƒ แƒ˜ แƒ“แƒ แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒแƒ“แƒ˜ แƒ™แƒแƒ“แƒ˜. แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒœแƒ˜แƒ›แƒฃแƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ•แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ— collectionView-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก GameController-แƒจแƒ˜. แƒแƒฎแƒšแƒ แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ. แƒกแƒ˜แƒœแƒขแƒแƒฅแƒกแƒ˜ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

protocol MemoryGameProtocol {
    //protocol definition goes here
}

แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒชแƒ˜แƒ—, แƒ แƒแƒ› แƒžแƒ แƒแƒขแƒแƒ™แƒแƒšแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒ’แƒแƒœแƒ•แƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ— แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜ แƒแƒœ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ™แƒšแƒแƒกแƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒกแƒ” แƒ แƒแƒ›, แƒ›แƒแƒ“แƒ˜แƒ— แƒ•แƒ˜แƒคแƒ˜แƒฅแƒ แƒแƒ— แƒ˜แƒ›แƒแƒ–แƒ”, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ แƒ˜ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ˜แƒกแƒ˜แƒœแƒ˜. แƒกแƒฃแƒš แƒแƒ—แƒฎแƒ˜ แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ—.

  • แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ: memoryGameDidStart.
  • แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ›แƒแƒแƒ‘แƒ แƒฃแƒœแƒแƒ— แƒ‘แƒแƒ แƒแƒ—แƒ˜ แƒกแƒแƒฎแƒ”แƒ–แƒ” แƒฅแƒ•แƒ”แƒ›แƒแƒ—: memoryGameShowCards.
  • แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ›แƒแƒแƒ‘แƒ แƒฃแƒœแƒแƒ— แƒ‘แƒแƒ แƒแƒ—แƒ˜ แƒกแƒแƒฎแƒ”แƒ–แƒ” แƒฅแƒ•แƒ”แƒ›แƒแƒ—: memoryGameHideCards.
  • แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ“แƒแƒกแƒแƒกแƒ แƒฃแƒšแƒ˜: memoryGameDidEnd.

แƒแƒ—แƒฎแƒ˜แƒ•แƒ” แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ™แƒšแƒแƒกแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ แƒ˜แƒก GameController.

memoryGameDidStart

แƒแƒ› แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒ—แƒแƒ›แƒแƒจแƒ˜ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ˜แƒฌแƒงแƒแƒก (แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ“แƒแƒแƒญแƒ”แƒ แƒก PLAY-แƒก). แƒแƒฅ แƒฉแƒ•แƒ”แƒœ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒ— แƒจแƒ˜แƒ’แƒ—แƒแƒ•แƒกแƒก collectView.reloadData()-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒช แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒก แƒแƒ”แƒ แƒ˜แƒ”แƒ‘แƒก.

func memoryGameDidStart(_ game: MemoryGame) {
    collectionView.reloadData()
}

memoryGameShowCards

แƒฉแƒ•แƒ”แƒœ แƒ•แƒฃแƒฌแƒแƒ“แƒ”แƒ‘แƒ— แƒแƒ› แƒ›แƒ”แƒ—แƒแƒ“แƒก collectionSDViewSelectItemAt-แƒ“แƒแƒœ. แƒฏแƒ”แƒ  แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒก แƒแƒ แƒฉแƒ”แƒฃแƒš แƒ‘แƒแƒ แƒแƒ—แƒก. แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก, แƒแƒ แƒ˜แƒก แƒ—แƒฃ แƒแƒ แƒ แƒจแƒ”แƒฃแƒกแƒแƒ‘แƒแƒ›แƒ แƒ‘แƒแƒ แƒแƒ—แƒ˜ cardsShown แƒ›แƒแƒกแƒ˜แƒ•แƒจแƒ˜ (แƒ—แƒฃ แƒ™แƒ”แƒœแƒขแƒ˜แƒ แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜ แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ). แƒ—แƒฃ แƒแƒ แƒ˜แƒก แƒ”แƒ แƒ—แƒ˜, แƒจแƒ”แƒ แƒฉแƒ”แƒฃแƒšแƒ˜ แƒ‘แƒแƒ แƒแƒ—แƒ˜ แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ›แƒแƒกแƒ—แƒแƒœ. แƒ—แƒฃ แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ แƒ”แƒ แƒ—แƒœแƒแƒ˜แƒ แƒ˜แƒ, แƒแƒ แƒ˜แƒ•แƒ” แƒ™แƒแƒ แƒขแƒ˜ แƒ”แƒ›แƒแƒขแƒ”แƒ‘แƒ แƒ™แƒแƒ แƒขแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜แƒ แƒ“แƒ แƒ แƒฉแƒ”แƒ‘แƒ แƒžแƒ˜แƒ แƒ˜แƒกแƒžแƒ˜แƒ . แƒ—แƒฃ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ, แƒ‘แƒแƒ แƒแƒ—แƒ˜ แƒขแƒแƒ•แƒ”แƒ‘แƒก แƒ™แƒแƒ แƒขแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜แƒ แƒ“แƒ แƒแƒ แƒ˜แƒ•แƒ” แƒจแƒ”แƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒžแƒ˜แƒ แƒ˜แƒกแƒžแƒ˜แƒ .

memoryGameHideCards

แƒ—แƒฃ แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ แƒแƒ  แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ, แƒ”แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒซแƒแƒฎแƒ”แƒ‘แƒ แƒ“แƒ แƒ‘แƒแƒ แƒแƒ—แƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ”แƒ‘แƒ˜ แƒ“แƒแƒ›แƒแƒšแƒฃแƒšแƒ˜แƒ.

แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜ = แƒงแƒแƒšแƒ‘แƒ˜.

memoryGameDidEnd

แƒแƒ› แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒกแƒแƒก, แƒ”แƒก แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒงแƒ•แƒ”แƒšแƒ แƒ™แƒแƒ แƒขแƒ˜ แƒฃแƒ™แƒ•แƒ” แƒ’แƒแƒ›แƒแƒ•แƒšแƒ”แƒœแƒ˜แƒšแƒ˜แƒ แƒ“แƒ แƒแƒ แƒ˜แƒก cardsShown แƒกแƒ˜แƒแƒจแƒ˜: cardsShown.count = cards.count, แƒแƒกแƒ” แƒ แƒแƒ› แƒ—แƒแƒ›แƒแƒจแƒ˜ แƒ“แƒแƒกแƒ แƒฃแƒšแƒ“แƒ. แƒ›แƒ”แƒ—แƒแƒ“แƒก แƒ’แƒแƒ›แƒแƒ˜แƒซแƒแƒฎแƒ”แƒ‘แƒ”แƒœ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒแƒ“ แƒ›แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒ•แƒฃแƒฌแƒแƒ“แƒ”แƒ‘แƒ— endGame() isPlaying var-แƒ˜แƒก แƒ“แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“ false-แƒ–แƒ”, แƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒแƒช แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ. แƒแƒกแƒ”แƒ•แƒ” alertController แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒ แƒแƒ’แƒแƒ แƒช แƒ˜แƒœแƒ“แƒ˜แƒ™แƒแƒขแƒแƒ แƒ˜ แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ’แƒแƒ›แƒแƒ˜แƒซแƒแƒฎแƒ”แƒ‘แƒ viewDidDisappear แƒ“แƒ แƒ—แƒแƒ›แƒแƒจแƒ˜ แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒฃแƒšแƒ˜แƒ.

แƒแƒ˜, แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ GameController-แƒจแƒ˜:

extension GameController: MemoryGameProtocol {
    func memoryGameDidStart(_ game: MemoryGame) {
        collectionView.reloadData()
    }
 
 
    func memoryGame(_ game: MemoryGame, showCards cards: [Card]) {
        for card in cards {
            guard let index = game.indexForCard(card)
                else { continue
            }        
            
            let cell = collectionView.cellForItem(
                at: IndexPath(item: index, section:0)
            ) as! CardCell
 
            cell.showCard(true, animted: true)
        }
    }
 
    func memoryGame(_ game: MemoryGame, hideCards cards: [Card]) {
        for card in cards {
            guard let index = game.indexForCard(card)
                else { continue
            }
            
            let cell = collectionView.cellForItem(
                at: IndexPath(item: index, section:0)
            ) as! CardCell
    
            cell.showCard(false, animted: true)
        }
    }
 
    func memoryGameDidEnd(_ game: MemoryGame) {
        let alertController = UIAlertController(
            title: defaultAlertTitle,
            message: defaultAlertMessage,
            preferredStyle: .alert
        )
 
        let cancelAction = UIAlertAction(
            title: "Nah", style: .cancel) {
            [weak self] (action) in
            self?.collectionView.isHidden = true
        }
 
        let playAgainAction = UIAlertAction(
            title: "Dale!", style: .default) {
            [weak self] (action) in
            self?.collectionView.isHidden = true
 
            self?.resetGame()
        }
 
        alertController.addAction(cancelAction)
        alertController.addAction(playAgainAction)
        
        self.present(alertController, animated: true) { }
    
        resetGame()
    }
}

แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒ แƒแƒ—แƒ”แƒ‘แƒ˜แƒก แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ Swift-แƒจแƒ˜
แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜, แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜แƒ. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ”แƒก แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒ—แƒแƒ›แƒแƒจแƒ˜แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“.

แƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒ˜ แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒ!

Skillbox แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ—:

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ