์ด ๊ธ์ ์ ๊ฐ ์ ๋ง ์ข์ํ๋ ๊ฐ๋จํ ๊ธฐ์ต๋ ฅ ํ๋ จ ๊ฒ์์ ๋ง๋๋ ๊ณผ์ ์ ์ค๋ช
ํฉ๋๋ค. ๊ทธ ์์ฒด๋ก ์ข์ ๊ฒ ์ธ์๋ Swift ํด๋์ค์ ํ๋กํ ์ฝ์ ๋ํด ์กฐ๊ธ ๋ ๋ฐฐ์ฐ๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง ์์ํ๊ธฐ ์ ์ ๊ฒ์ ์์ฒด๋ฅผ ์ดํดํด ๋ด
์๋ค.
์๋ฆผ: "Habr"์ ๋ชจ๋ ๋ ์๋ฅผ ์ํ - "Habr" ํ๋ก๋ชจ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ Skillbox ๊ณผ์ ์ ๋ฑ๋กํ ๋ 10 ๋ฃจ๋ธ ํ ์ธ.
Skillbox๋ ๋ค์์ ๊ถ์ฅํฉ๋๋ค. ๊ต์ก์ฉ ์จ๋ผ์ธ ๊ณผ์
"์ง์ ์๋ฐ ๊ฐ๋ฐ์" .
๋ฉ๋ชจ๋ฆฌ ์นด๋ ํ๋ ์ด ๋ฐฉ๋ฒ
๊ฒ์์ ์นด๋ ์ธํธ๋ฅผ ์์ฐํ๋ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ๊ทธ๋ค์ ์๋๋ ค ๋์ ์์ต๋๋ค (๊ฐ๊ฐ ์ด๋ฏธ์ง๊ฐ ์๋๋ก ํฅํจ). ํ๋๋ฅผ ํด๋ฆญํ๋ฉด ์ด๋ฏธ์ง๊ฐ ๋ช ์ด ๋์ ์ด๋ฆฝ๋๋ค.
ํ๋ ์ด์ด์ ์๋ฌด๋ ๋์ผํ ๊ทธ๋ฆผ์ด ์๋ ๋ชจ๋ ์นด๋๋ฅผ ์ฐพ๋ ๊ฒ์ ๋๋ค. ์ฒซ ๋ฒ์งธ ์นด๋๋ฅผ ์ฐ ํ ๋ ๋ฒ์งธ ์นด๋๋ฅผ ๋ค์ง์ด์ ๊ทธ๋ฆผ์ด ์ผ์นํ๋ฉด ๋ ์นด๋ ๋ชจ๋ ์ด๋ฆฐ ์ํ๋ก ์ ์ง๋ฉ๋๋ค. ์ผ์นํ์ง ์์ผ๋ฉด ์นด๋๊ฐ ๋ค์ ๋ซํ๋๋ค. ๋ชฉํ๋ ๋ชจ๋ ๊ฒ์ ์ฌ๋ ๊ฒ์ ๋๋ค.
ํ๋ก์ ํธ ๊ตฌ์กฐ
์ด ๊ฒ์์ ๊ฐ๋จํ ๋ฒ์ ์ ๋ง๋ค๋ ค๋ฉด ๋ค์ ๊ตฌ์ฑ ์์๊ฐ ํ์ํฉ๋๋ค.
- ํ๋์ ์ปจํธ๋กค๋ฌ: 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์ ๊ฒฝ์ฐ NSUUIS().uuidString์ ํธ์ถํ์ฌ ์์์ ID๋ฅผ ์์ฑํฉ๋๋ค.
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 ๊ทธ๋ฆฌ๋๋ฅผ ์ค์ ํฉ๋๋ค. ๋ชจ๋ธ์๋ ์นด๋(๊ทธ๋ฆฌ๋ ์์ ์นด๋ ๋ฐฐ์ด), ์นด๋๊ฐ ์ด๋ฏธ ์ด๋ ค ์๋ ์นด๋ ํ์ ๋ฐฐ์ด, ๊ฒ์ ์ํ๋ฅผ ์ถ์ ํ๋ ๋ถ์ธ ๋ณ์ 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 ๋ณ์๋ฅผ 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๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฒ์์๋ ๊ทธ๋ฆฌ๋ ์ด๋ฏธ์ง๋ฅผ ํฌํจํ์ฌ ์ปจํธ๋กค๋ฌ์์ ์ ๊ฒ์์ viewDidLoad๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ๊ฒ์์์๋ ์ด ๋ชจ๋ ๊ฒ์ด 4*4 collectionView๋ก ํํ๋ฉ๋๋ค. collectionView์ ์์ง ์ต์ํ์ง ์๋ค๋ฉด ์ฌ๊ธฐ์ ์์ต๋๋ค.
GameController๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฃจํธ ์ปจํธ๋กค๋ฌ๋ก ๊ตฌ์ฑํ๊ฒ ์ต๋๋ค. GameController์๋ IBOutlet์ผ๋ก ์ฐธ์กฐํ collectionView๊ฐ ์์ต๋๋ค. ๋ ๋ค๋ฅธ ์ฐธ์กฐ๋ IBAction onStartGame() ๋ฒํผ์ ๋ํ ๊ฒ์ ๋๋ค. ์ด๋ UIButton์ด๋ฉฐ PLAY๋ผ๋ ์คํ ๋ฆฌ๋ณด๋์์ ๋ณผ ์ ์์ต๋๋ค.
์ปจํธ๋กค๋ฌ ๊ตฌํ์ ๋ํด ์กฐ๊ธ:
- ๋จผ์ ๋ ๊ฐ์ง ์ฃผ์ ๊ฐ์ฒด์ธ ๊ทธ๋ฆฌ๋: game = MemoryGame() ๋ฐ ์นด๋ ์ธํธ: ์นด๋ = [Card]()๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- ์ด๊ธฐ ๋ณ์๋ฅผ viewDidLoad๋ก ์ค์ ํ๋๋ฐ, ์ด๋ ๊ฒ์์ด ์คํ๋๋ ๋์ ํธ์ถ๋๋ ์ฒซ ๋ฒ์งธ ๋ฉ์๋์ ๋๋ค.
- ์ฌ์ฉ์๊ฐ PLAY๋ฅผ ๋๋ฅผ ๋๊น์ง ๋ชจ๋ ์นด๋๊ฐ ์จ๊ฒจ์ง๋ฏ๋ก collectionView๋ ์จ๊น์ผ๋ก ์ค์ ๋ฉ๋๋ค.
- 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)
}
}
์ด์ ์ค์ํ ํ๋กํ ์ฝ์ ๋ํด ์กฐ๊ธ ์ด์ผ๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค.
ํ๋กํ ์ฝ
ํ๋กํ ์ฝ ์์ ์ Swift ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ ๋๋ค. ํ๋กํ ์ฝ์ ํด๋์ค, ๊ตฌ์กฐ ๋๋ ์ด๊ฑฐํ์ ๋ํ ๊ท์น์ ์ ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด ์์น์ ์ฌ์ฉํ๋ฉด ๋ชจ๋์ ๋ฐ ํ์ฅ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ค์ ๋ก ์ด๊ฒ์ GameController์์ collectionView์ ๋ํด ์ด๋ฏธ ๊ตฌํํ๊ณ ์๋ ํจํด์ ๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ง์ ๋ฒ์ ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
protocol MemoryGameProtocol {
//protocol definition goes here
}
์ฐ๋ฆฌ๋ ํ๋กํ ์ฝ์ ํตํด ํด๋์ค ๊ตฌํ์ ์ํ ๊ท์น์ด๋ ์ง์นจ์ ์ ์ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฏ๋ก ํ๋กํ ์ฝ์ด ๋ฌด์์ด์ด์ผ ํ๋์ง ์๊ฐํด ๋ด ์๋ค. ์ด XNUMX๊ฐ๊ฐ ํ์ํฉ๋๋ค.
- ๊ฒ์ ์์: memoryGameDidStart.
- ๋ฉ๋ชจ๋ฆฌ๊ฒ์์ผ์นด๋(memoryGameShowCards) ์นด๋๋ฅผ ๋ค์ง์ด์ผ ํฉ๋๋ค.
- ์นด๋๋ฅผ ๋ค์ง์ด์ผ ํฉ๋๋ค: memoryGameHideCards.
- ๊ฒ์ ์ข ๋ฃ: memoryGameDidEnd.
๋ค ๊ฐ์ง ๋ฉ์๋ ๋ชจ๋ GameController์ธ ๊ธฐ๋ณธ ํด๋์ค์ ๋ํด ๊ตฌํ๋ ์ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ๊ฒ์DidStart
์ด ๋ฉ์๋๊ฐ ์คํ๋๋ฉด ๊ฒ์์ด ์์๋์ด์ผ ํฉ๋๋ค(์ฌ์ฉ์๊ฐ PLAY๋ฅผ ๋๋ฆ). ์ฌ๊ธฐ์์๋ ์นด๋๋ฅผ ์๋ collectionView.reloadData()๋ฅผ ํธ์ถํ์ฌ ์ฝํ ์ธ ๋ฅผ ๋ค์ ๋ก๋ํ๊ฒ ์ต๋๋ค.
func memoryGameDidStart(_ game: MemoryGame) {
collectionView.reloadData()
}
๋ฉ๋ชจ๋ฆฌ๊ฒ์์ผ์นด๋
collectionSDViewSelectItemAt์์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ๋จผ์ ์ ํํ ์นด๋๊ฐ ํ์๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ CardShown ๋ฐฐ์ด์ ์ผ์นํ์ง ์๋ ์นด๋๊ฐ ์๋์ง ํ์ธํฉ๋๋ค(cardShown ์๊ฐ ํ์์ธ ๊ฒฝ์ฐ). ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ ํํ ์นด๋์ ๋น๊ต๋ฉ๋๋ค. ๊ทธ๋ฆผ์ด ๋์ผํ๋ฉด ๋ ์นด๋ ๋ชจ๋ ํ์๋ ์นด๋์ ์ถ๊ฐ๋๊ณ ์๋ฉด์ด ์๋ก ์ ์ง๋ฉ๋๋ค. ๋ค๋ฅธ ๊ฒฝ์ฐ ์นด๋๋ ์นด๋ ํ์ ์ํ๋ฅผ ์ ์งํ๊ณ ๋ ๋ค ๋ค์ง์ด ๋์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ๊ฒ์์จ๊ธฐ๊ธฐ์นด๋
์นด๋๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด ์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๊ณ ์นด๋ ์ด๋ฏธ์ง๊ฐ ์จ๊ฒจ์ง๋๋ค.
ํ์ = ๊ฑฐ์ง
๋ฉ๋ชจ๋ฆฌ๊ฒ์์ด ์ข ๋ฃ๋์์ต๋๋ค.
์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ๋ชจ๋ ์นด๋๊ฐ ์ด๋ฏธ ๊ณต๊ฐ๋์ด ์๊ณ CardShown ๋ชฉ๋ก์ ์์์ ์๋ฏธํฉ๋๋ค(cardShown.count =cards.count). ๋ฐ๋ผ์ ๊ฒ์์ด ์ข ๋ฃ๋ฉ๋๋ค. ์ด ๋ฉ์๋๋ isPlaying ๋ณ์๋ฅผ false๋ก ์ค์ ํ๊ธฐ ์ํด endGame()์ ํธ์ถํ ํ์ ํธ์ถ๋๋ฉฐ, ๊ทธ ํ ๊ฒ์ ์ข ๋ฃ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ๋ํ 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()
}
}
์ฌ์ค ๊ทธ๊ฒ ์ ๋ถ์
๋๋ค. ์ด ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ง์ ๊ฒ์ ๋ฒ์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
์ฆ๊ฑฐ์ด ์ฝ๋ฉํ์ธ์!
Skillbox๋ ๋ค์์ ๊ถ์ฅํฉ๋๋ค.
- ์ค๊ธฐ ์ฝ์ค
"๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์ PRO" .- ์จ๋ผ์ธ ๊ฐ์ข ์ ์ฉ
"ํ์ด์ฌ ๋ฐ์ดํฐ ๋ถ์๊ฐ" .- XNUMX๋ ์ค์ต ์ฝ์ค
"์ ๋ PRO ์น ๊ฐ๋ฐ์์ ๋๋ค" .
์ถ์ฒ : habr.com