Инициализация моей playerCard не работает - PullRequest
1 голос
/ 13 января 2020

Я новичок в swift и пытаюсь сделать простую карточную игру, в которой игрок и компьютер вытаскивают aws карту, а тот, у кого самая большая карта, выигрывает. Но когда я вызываю свою функцию CompareCards, я получаю сообщение об ошибке: константа playerCard использовалась перед инициализацией. Я думал, что уже инициализировал playerCard, поэтому мне интересно, кто-нибудь может сказать мне, что не так с моим кодом? Спасибо.

import Foundation
func randomInteger(upper: Int) -> Int {
    return Int(arc4random_uniform(UInt32(upper)))
}


enum Rank: Int{
    case two = 2,
    three,
    four, five,
    six,
    seven,
    eight,
    nine,
    ten,
    jack,
    queen,
    king,
    ace

    static func allValues() -> [Rank]{
        return [two, three, four, five, six, seven, eight, nine, ten, jack, queen, king, ace]
    }
}

enum Suit: Int{
    case clubs = 1,
    diamonds,
    hearts,
    spades

    static func allValues() -> [Suit]{
        return [spades, hearts, diamonds, clubs]
    }
}

struct Card{
    var rank: Rank = .two
    var suit: Suit = .clubs

    init(rank: Rank, suit: Suit){
        self.rank = rank
        self.suit = suit
    }
}

class Deck{

    var deck: [Card] = []
    var rankArray: [Rank] = []
    var suitArray: [Suit] = []

    init(){
        rankArray = Rank.allValues()
        suitArray = Suit.allValues()

        for aRank in rankArray{
            for aSuit in suitArray{
                let aCard = Card(rank: aRank, suit: aSuit)
                deck.append(aCard)
            }
        }

    }

    func drawOne() -> Card?{
        if deck.count != 0{
            let randomCard = randomInteger(upper: deck.count)
            let aCard = deck[randomCard]
            deck.remove(at: randomCard)
            return aCard
        }
        else{
            return nil
        }
    } 
}

func compareCards(playerCard: Card, computerCard: Card) -> String{
    var isPlayerGreater: Bool = false

    if playerCard.rank != computerCard.rank{
        if playerCard.rank.rawValue > computerCard.rank.rawValue{
            isPlayerGreater = true
        }
    }

    if playerCard.suit.rawValue > computerCard.suit.rawValue{
        isPlayerGreater = true
    }

    if isPlayerGreater == true{
        return "The player won with the \(playerCard.rank) of \(playerCard.suit)!"
    }

    else{
        return "The computer won with the \(computerCard.rank) of \(computerCard.suit)!"
    }
}

/////////////////////////////////////////////////////////////////////////////////////////////////

let playerCard: Card
let computerCard: Card

let aDeck = Deck()
if let aCard = aDeck.drawOne(){
    playerCard = Card(rank: aCard.rank, suit: aCard.suit)
}

if let aCard = aDeck.drawOne(){
    computerCard = Card(rank: aCard.rank, suit: aCard.suit)
}

var result: String = compareCards(playerCard: playerCard, computerCard: computerCard)
print(result)

Ответы [ 4 ]

1 голос
/ 13 января 2020

потому что вы не инициализировали. Ваша функция darawOne () имеет значение null, и вы устанавливаете условие «if aDeck -> playercard = aDeck». что если результат == ноль ??? Я изменил ваш последний код на это:

let aDeck = Deck()
if let aCard = aDeck.drawOne(), let seCard = aDeck.drawOne(){
    let playerCard = Card(rank: aCard.rank, suit: aCard.suit)
    let computerCard = Card(rank: aCard.rank, suit: seCard.suit)

    let result: String = compareCards(playerCard: playerCard, computerCard: computerCard)
    print(result)
}
0 голосов
/ 13 января 2020

Ваша проблема в том, что вы должны инициализировать playerCard и computerCard перед его использованием. Если ваш код не пройдет оператор if let, ваши карты не будут инициализированы.

Здесь у вас есть по крайней мере две опции: либо предоставьте значение по умолчанию для ваших переменных, либо пометьте их как принудительно развернутые, так что компилятор будет игнорировать не инициированное состояние, так как вы говорите, что вы на 100% уверены, что переменные будут во время выполнения.

Второй вариант будет выглядеть следующим образом:

Замените ваш

let playerCard: Card
let computerCard: Card

на:

var playerCard: Card!
var computerCard: Card!
0 голосов
/ 13 января 2020

Вам нужно просто объявить переменную playerCard и computerCard с ключевым словом var вместо let

Вы можете использовать let, когда знаете, что однажды вы присваивать значение переменной, оно не изменяется, и с помощью var вы можете изменить значение переменной.

var playerCard: Card
var computerCard: Card

let aDeck = Deck()
if let aCard = aDeck.drawOne(){
    playerCard = Card(rank: aCard.rank, suit: aCard.suit) //you are assigning/changing the value here of playerCard variable.
}

if let aCard = aDeck.drawOne(){
    computerCard = Card(rank: aCard.rank, suit: aCard.suit) //you are assigning/changing the value here of playerCard variable.
}
0 голосов
/ 13 января 2020

Ниже код работает хорошо.

let aDeck = Deck()

if let playerCard = aDeck.drawOne(), let computerCard = aDeck.drawOne() {
    var result: String = compareCards(playerCard: playerCard, computerCard: computerCard)
    print(result)
}

Ошибка была выдана компилятором, потому что вы объявили две необязательные константы, но не инициализировали их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...