á€áá±á¬ááºážáá«ážááẠáá»áœááºá¯ááºááááºááŸá
áºáááºáá±á¬ ááá¯ážááŸááºážáá±á¬ ááŸááºáá¬ááºáá±á·áá»áá·áºáá±ážááááºážááᯠáááºáá®ážááá·áº áá¯ááºáááºážá
ááºááᯠáá±á¬áºááŒáááºá áá°á·áá¬áá¬áá° áá±á¬ááºážáá±á¬ááºážáá±ááá¯ááºáá²á·á¡ááŒááºá áááºááœá¬ážáááºážáá²á· Swift á¡áááºážááœá±áá²á· áááá¯ááá¯áá±á¬ááœá±á¡ááŒá±á¬ááºáž áááºážáááºážáááºáá±á·áá¬áááºá áá«áá±ááá·áº áá»áœááºáá±á¬áºááá¯á· áá
áááºá ááááºážááᯠááá¯ááºááá¯áẠáá¬ážáááºááŒáá¡á±á¬ááºá
áá«ááá¯á·áááºážááá¯ááááá±ážááẠ"Habr" áá á¬áááºáá°á¡á¬ážáá¯á¶ážá¡ááœáẠ- "Habr" áááá¯ááá¯ážááŸááºážáá¯ááºááᯠá¡áá¯á¶ážááŒá¯á áááºááá·áº Skillbox áááºáááºážááœááºá á¬áááºážááœááºážááá·áºá¡áá« 10 áá°áááºáá»áŸá±á¬á·á á»á±ážá
Skillbox á០á¡ááŒá¶ááŒá¯áá¬ážáááº- ááá¬áá±ážá¡áœááºááá¯ááºážáááºáááºáž
"Profession Java developer" .
Memory Card áá á¬ážáááºáž
ááááºážááẠáááºá¡á á¯á¶ááᯠááá¯ááºááŒááŒááºážááŒáá·áº á áááºáááºá ááŸá±á¬ááºáá»ááºá¡áááºááŒááẠ(á¡áá®ážáá®ážá áááºážáá¯áá±á¬áº)á áá áºáá¯áá¯ááᯠááŸáááºááá¯ááºáá±á¬á¡áá«á áá¯á¶ááẠá áá¹ááá·áºá¡áááºážáááºááŒá¬ ááœáá·áºáá¬áááºá
áá á¬ážááá¬ážááá¬áááºááŸá¬ áá°áá®áá±á¬áá¯á¶áá»á¬ážáá«ááá·áº áááºá¡á¬ážáá¯á¶ážááᯠááŸá¬ááœá±áááºááŒá áºáááºá ááááááºááá¯ááœáá·áºááŒá®ážáá±á¬ááºá áááºááẠáá¯áááááŒá±á¬ááºááá¯ááŸáá·áºááŒá®áž áá¯á¶áá»á¬ážááá¯ááºáá®áá«á áááºááŸá áºáá¯á áá¯á¶ážááẠáááºáááºááœáá·áºáá±áááºááŒá áºáááºá áááá¯ááºáá®áá«á áááºáá»á¬ážááᯠáááºáá¶ááááºáá«áááºá áááºááŸááºážáá»ááºá á¡áá¬á¡á¬ážáá¯á¶ážááᯠááœáá·áºáááá¯á·áá«á
á á®áá¶ááááºážááœá²á·á ááºážáá¯á¶
á€ááááºážá ááá¯ážááŸááºážáá±á¬áá¬ážááŸááºážááᯠáááºáá®ážááẠá¡á±á¬ááºáá« á¡á áááºá¡ááá¯ááºážáá»á¬áž ááá¯á¡ááºááẠá
- ááááºážáá»á¯ááºáááááá¬áá áºáá¯- GameController.swiftá
- One View- CardCell.swiftá
- áá±á¬áºáááºááŸá áºáá»áá¯áž- MemoryGame.swift ááŸáá·áº Card.swiftá
- á¡á áááºá¡ááá¯ááºážá¡á á¯á¶á¡áááºááᯠáááŸáááá¯ááºááŒá±á¬ááºáž áá±áá»á¬á á±ááẠMain.storyboard
áá»áœááºá¯ááºááá¯á·ááẠááááºážá á¡ááá¯ážááŸááºážáá¯á¶áž á¡á áááºá¡ááá¯ááºážááŒá áºáá±á¬ áááºáá»á¬ážááŒáá·áº á áááºáá«áááºá
Card.swift
áááºáá±á¬áºáááºááœáẠáá¯ááºááá¹áá áá¯á¶ážáá¯ááŸááá«áááº- áá áºáá¯á á®ááᯠááœá²ááŒá¬ážááẠidá áááºá á¡ááŒá±á¡áá±ááᯠáááºááŸááºááẠááŒáá¬ážááá·áº boolean variable áá áºáá¯ááŸáá·áº áááºáá»á¬ážááŸá áá¯á¶áá»á¬ážá¡ááœáẠartworkURLá
class Card {
var id: String
var shown: Bool = false
var artworkURL: UIImage!
}
ááŒá±áá¯á¶áá»á¬ážááŸáá·áº á¡áá¯á¶ážááŒá¯áá° á¡ááŒááºá¡ááŸááºáááºááœááºááŸá¯ááᯠááááºážáá»á¯ááºáááºá¡ááœáẠáááºááẠá€áááºážáááºážáá»á¬ážááᯠááá¯á¡ááºáááá·áºáááº-
áááºáá±á«áºááœáẠáá¯á¶áá áºáá¯á¶ááᯠááŒáááẠáááºážáááºážá á€ááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá¯ááºááá¹ááá¡á¬ážáá¯á¶ážááᯠáá¯á¶áá±á¡ááŒá ẠááŒááºáááºáááºááŸááºáááºá id á¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠNSUUIS(.uuidString) ááá¯áá±á«áºááá¯ááŒááºážááŒáá·áº áá»áááºáž id ááá¯áá¯ááºáá±ážáá«áááºá
init(image: UIImage) {
self.id = NSUUID().uuidString
self.shown = false
self.artworkURL = image
}
ID áááºáá»á¬ážááᯠááŸáá¯ááºážááŸááºáááºážá
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 class áá²á· extension áá áºáá¯ááŒá áºá¡á±á¬áẠáá¯ááºáááºá
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 ááá¬ážááœááºááᯠáááºááŸááºáááºá áá±á¬áºáááºááœáẠáááºáá»á¬áž (ááá áºáá áºáá¯áá±á«áºááŸá áááºáá»á¬áž á¡áááºážá¡áá»ááºážáá áºáá¯)á ááœáá·áºáá¬ážááŒá®ážáá±á¬ áááºáá»á¬ážááŒáá·áº ááŒááá¬ážááá·áº áááºážáá»ááºážáá áºáá¯á ááááºážá á¡ááŒá±á¡áá±ááᯠááŒá±áá¬áá¶ááẠboolean variable isPlaying áá²á·ááá¯á·áá±á¬ áá¯ááºááá¹áááá»á¬áž áá«ááŸááááºá
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 variable ááᯠtrue á¡ááŒá Ạá áááºááẠááááááºážáááºážááᯠáá±á«áºáááºá
func newGame(cardsArray:[Card]) -> [Card] {
cards = shuffleCards(cards: cardsArray)
isPlaying = true
return cards
}
ááááºážááᯠááŒááºáááºá áááºááá¯áá«áá ááá¯á·áá±á¬ááºáá»áœááºá¯ááºááá¯á·ááẠisPlaying variable ááᯠ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 ááẠá€áá²á·ááá¯á· ááŒá áºáááº-
á¡á
ááá¯ááºážááœááºá áááºááẠááááºážá¡áá
áºááᯠááá¬ážááœááºá¡ááœáẠáá¯á¶áá»á¬ážá¡áá«á¡ááẠááááºážáá»á¯ááºáááááá¬ááŸá viewDidLoad á¡ááŒá
ẠáááºááŸááºááẠááá¯á¡ááºáááºá ááááºážááœááºá á€á¡áá¬á¡á¬ážáá¯á¶ážááᯠ4*4 collectionView ááŒáá·áº ááá¯ááºá
á¬ážááŒá¯áá«áááºá collectionView áá²á· ááááºážááŸá®ážáá±ážááẠáá®ááŸá¬ áá«á
GameController ááᯠá¡ááá®áá±ážááŸááºážá root controller á¡ááŒá ẠáááºááŸááºáá±ážáá«áááºá GameController ááœáẠáá»áœááºá¯ááºááá¯á· IBOoutlet á¡ááŒá ẠáááºááœáŸááºážááá·áº collectionView áá áºáá¯ááŸááá«áááºá áá±á¬ááºáááºáááºááœáŸááºážáá»ááºááŸá¬ IBAction onStartGame() ááá¯ááºá¡ááœááºá áááºážááẠUIButton ááŒá áºááŒá®ážá áááºážááᯠPLAY áá¯áá±á«áºáá±á¬ áááºáááºážáá¯ááºááœáẠáááºááœá±á·ááá¯ááºáá«áááºá
ááááºážáá»á¯ááºáááááá¬áá»á¬áž á¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá¡ááŒá±á¬ááºáž á¡áááºážáááºá
- ááááŠážá áœá¬ áá»áœááºá¯ááºááá¯á·ááẠá¡ááá á¡áá¬ááá¹áᯠááŸá áºáᯠ- ááá¬ážááœááº- ááááºáž = MemoryGame(), ááŸáá·áº áááºáá»á¬áž- áááºáá»á¬áž = [áááº]().
- áá»áœááºá¯ááºááá¯á·ááẠáááŠáž variable áá»á¬ážááᯠviewDidLoad á¡ááŒá ẠáááºááŸááºáááºá á€áááºááŸá¬ ááááºážáááºáááºáá±áá»áááºááœáẠáá±á«áºáá±á¬ ááááá¯á¶ážáááºážáááºážááŒá áºáááºá
- collectionView ááᯠá¡áá¯á¶ážááŒá¯áá°á PLAY áááŸáááºááá»ááºáž áááºá¡á¬ážáá¯á¶ážááᯠááŸááºáá¬ážáá±á¬ááŒá±á¬áá·áº ááŸááºáá¬ážááẠáááºááŸááºáá¬ážáááºá
- áá»áœááºá¯ááºááá¯á· PLAY ááá¯ááŸáááºáááºááŸáá·áºáá áºááŒáá¯ááºáááºá onStartGame IBAction á¡ááá¯ááºážá áááºááŒá®áž áááºáá»á¬ážááá¯ááŒááºááá¯ááºá á±ááẠcollectionView 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)
}
}
á¡áᯠá¡áá±ážááŒá®ážáá²á· áááá¯ááá¯áá±á¬ááœá±á¡ááŒá±á¬ááºáž áááºážáááºážááŒá±á¬áá¡á±á¬ááºá
Protocols áá»á¬áž
áááá¯ááá¯áá±á¬áá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºááŒááºážááẠSwift áááá¯ááááºážáááºážá á¡áááá¡áá»ááºááŒá áºáááºá áááá¯ááá¯áá±á¬áá»á¬ážááẠá¡áááºážá ááœá²á·á ááºážáá¯á¶ ááá¯á·ááá¯áẠá á¬áááºážáá±á¬ááºááŒááºážá¡ááœáẠá ááºážáá»ááºážáá»á¬ážááᯠáááºááŸááºááẠá áœááºážáááºááᯠáá±ážáááºá á€áááá¬áááẠááá·áºá¡á¬áž modular ááŸáá·áº extensible code áá±ážááá¯ááºáááºá ááááºáá±á¬á·á áá«á GameController ááŸá collectionView á¡ááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®ážáá¬áž áá¯á¶á á¶áá áºáá¯áá«á ááá¯áá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯ááºáá¬ážááŸááºážááá¯áá¯ááºááŒáá«á áá¯á·á syntax ááẠá€áá²á·ááá¯á·ááŒá áºáá±áááá·áºáááº-
protocol MemoryGameProtocol {
//protocol definition goes here
}
áááá¯ááá¯áá±á¬áá áºáá¯ááẠá¡áááºážáá áºáá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáááºá¡ááœáẠá ááºážáá»ááºážáá»á¬áž ááá¯á·ááá¯áẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠáááºááŸááºááẠááá·áºá¡á¬áž ááœáá·áºááŒá¯ááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á·áááááºá ááá¯á·ááŒá±á¬áá·áº áááºážááá¯á·ááẠá¡áááºá¡áá¬ááŒá áºááá·áºáááºááᯠá ááºážá á¬ážááŒáá·áºááŒáá«á áá¯á·á á á¯á á¯áá±á«ááºáž áá±ážáá¯ááá¯áá«áááºá
- ááááºážá áááºááŒááºáž- memoryGameDidStartá
- áááºááẠáááºááᯠá¡á±á¬ááºááá¯á·ááŸáá·áºááẠááá¯á¡ááºáááº- memoryGameShowCardsá
- áááºááẠáááºááᯠá¡á±á¬ááºááá¯á·ááŸáá·áºááẠááá¯á¡ááºáááº- memoryGameHideCardsá
- ááááºážá¡áá¯á¶áž- memoryGameDidEndá
GameController ááŒá áºááá·áº main class á¡ááœáẠáááºážáááºážáá±ážáá¯áá¯á¶ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáá«áááºá
memoryGameDidStart
á€áááºážáááºážááá¯áá¯ááºáá±á¬ááºáá±á¬á¡áá«á ááááºážá áááºááá·áºááẠ(á¡áá¯á¶ážááŒá¯áá°ááẠPLAY ááá¯ááŸáááºáááº)á á€ááœáẠáá»áœááºá¯ááºááá¯á·ááẠcollectionView.reloadData() ááá¯áá±á«áºááá¯ááŒááºážááŒáá·áº á¡ááŒá±á¬ááºážá¡áá¬ááᯠáááºáá»á¬ážááᯠshuffle áá¯ááºáá«áááºá
func memoryGameDidStart(_ game: MemoryGame) {
collectionView.reloadData()
}
memoryGameShowCards
á€áááºážáááºážááᯠcollectionSDViewSelectItemAt ááŸáá±á«áºááá¯áá«áááºá ááááŠážá áœá¬ ááœá±ážáá»ááºáá¬ážáá±á¬ áááºááᯠááŒáá«á ááá¯á·áá±á¬áẠcardsShown array ááœáẠáááŸááºááá¯ááºáá±á¬ áááºáá áºáᯠááŸááááŸá (ááŒááá¬ážáá±á¬ áááºá¡áá±á¡ááœáẠáá°ážáááºážáá«á) á á áºáá±ážáá«á áá áºáá¯ááŸááá»áŸáẠááœá±ážáá»ááºáá¬ážáá±á¬áááºááᯠáááºážááŸáá·áº ááŸáá¯ááºážááŸááºáá«áááºá áá¯á¶áá»á¬ážááẠáá°áá®áá«áá áááºááŸá áºáá¯áá¯á¶ážááᯠááŒááá¬ážáá±á¬ áááºáá»á¬ážáá²ááá¯á· áá±á«ááºážááá·áºáᬠáá»ááºááŸá¬áá±á«áºááœáẠááŸááá±áááºááŒá áºáááºá ááá°áá®áá«áá áááºááẠáááºáá»á¬ážááá¯ááŒáááŒá®áž ááŸá áºáá¯áá¯á¶ážááᯠááŸá±á¬ááºáá»ááºááŸááºáá¬ážáááºá
memoryGameHideCards
áááºáá»á¬ážááŸáá·áº áááá¯ááºáá®áá«áá á€áááºážáááºážááᯠáá±á«áºááŒá®áž áááºáá¯á¶áá»á¬ážááᯠááŸááºáá¬ážáááºá
ááŒááẠ= ááŸá¬ážáá±á¬á
memoryGameDidEnd
á€áááºážáááºážááᯠáá±á«áºáá±á¬á¡áá«á áááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠáá¯ááºáá±á¬áºááŒá®ážááŒá áºááŒá±á¬ááºáž ááá¯ááá¯áááºááŸá¬ cardsShown list áá²ááœáẠááŸááá±áááº- cardsShown.count = cards.count, ááá¯á·ááŒá±á¬áá·áº ááááºážááŒá®ážááœá¬ážáá«ááŒá®á isPlaying var ááᯠfalse áá¯áááºááŸááºááẠendGame() ááá¯áá±á«áºááŒá®ážáá±á¬ááºá ááááºážá¡áá¯á¶ážáááºáááºáá±á·áá»áºááá¯ááŒáááŒá®ážáá±á¬áẠá¡ááá¯áá«áááºážáááºážááᯠá¡ááá¡áá»áá±á«áºáááºá ááá¯á·á¡ááŒáẠalertController ááᯠcontroller á¡ááœááºááœáŸááºááŒáá»ááºá¡ááŒá áºá¡áá¯á¶ážááŒá¯áááºá 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()
}
}
ááááºáá±á¬á· áá«áá«áá²á ááá·áºááá¯ááºááá¯ááºááááºážáá¬ážááŸááºážááᯠáááºáá®ážááẠá€ááá±á¬áá»ááºááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
áá»á±á¬áºááœáŸááºá áœá¬ áá¯ááºáá±ážáá«á
Skillbox á០á¡ááŒá¶ááŒá¯áá¬ážáááº-
- áááºááœá±á·áááºáááºáž
"ááá¯ááá¯ááºáž Developer PRO" .- á¡áá¯á¶ážáá» á¡áœááºááá¯ááºážáááºáááºáž
"Python Data Analyst" .- ááŸá áºááŸá áºá á¬áááºááœá±á·áááºáááºáž
"áá»áœááºáá±á¬áºá PRO ááẠdeveloper áá áºáá±á¬ááºáá«" .
source: www.habr.com