无法在属性初始化程序中使用实例成员'userCard1';属性初始化程序在“ self”可用之前运行错误

时间:2020-06-02 01:13:28

标签: ios swift xcode

尝试制作一个简单的Blackjack应用程序,以使自己习惯使用Xcode。我以前从未在Swift中进行编码,并且对C ++有所了解。出现错误,我不知道如何解决。我在对类似情况提出其他答案时遇到困难。

我不太确定是什么导致了问题,更不用说如何解决了:)


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    var balance = 500

    let suits = ["h","d","c","s"]

    //user card declarations
    @IBOutlet weak var userCard1: UIImageView!

    @IBOutlet weak var userCard2: UIImageView!

    @IBOutlet weak var userCard3: UIImageView!

    @IBOutlet weak var userCard4: UIImageView!

    @IBOutlet weak var userCard5: UIImageView!

    @IBOutlet weak var userCard6: UIImageView!

    @IBOutlet weak var userCard7: UIImageView!

    @IBOutlet weak var userCard8: UIImageView!

    @IBOutlet weak var userCard9: UIImageView!

    @IBOutlet weak var userCard10: UIImageView!

    //dealer card declarations
    @IBOutlet weak var dealerCard1: UIImageView!

    @IBOutlet weak var dealerCard2: UIImageView!

    @IBOutlet weak var dealerCard3: UIImageView!

    @IBOutlet weak var dealerCard4: UIImageView!

    @IBOutlet weak var dealerCard5: UIImageView!



    var win = false

    var bet = 0

    //bet label
    @IBOutlet weak var betLabel: UILabel!

    //bet slider
    @IBAction func betSlider(_ sender: UISlider) {
        betLabel.text = String(Int(sender.value))
    }
    @IBOutlet weak var betSliderValue: UISlider!

    var userCardSlot = 3
    var dealerCardSlot = 3

    var userTotal = 0
    var dealerTotal = 0

    //user cards displayed
    var userCardArray = [userCard1, userCard2, userCard3, userCard4, userCard5, userCard6, userCard7, userCard8, userCard9, userCard10]

    //dealer cards displayed
    var dealerCardArray = [dealerCard1, dealerCard2, dealerCard3, dealerCard4, dealerCard5]

    //hit button
    @IBAction func hitTapped(_ sender: Any) {
        var cardNum = Int.random(in: 2...14)
        var cardSuit = Int(arc4random()) % 4
        userCardArray[userCardSlot].image = UIImage(named: "\(cardSuit)card\(cardNum)")
    }

    //stand button
    @IBAction func standTapped(_ sender: Any) {
        for userTotal in userCardArray.reversed() {
            userTotal += cardNum
        }
        for dealerTotal in dealerCardArray {
            dealerTotal += cardNum
        }
        while dealerTotal < 17 {
            dealerCardSlot += 1
            dealerCardArray[dealerCardSlot].image = UIImage(named: "\(cardSuit)card\(cardNum)")
        }
        if dealerTotal <= userTotal {
            win = true
        } else {
            win = false
        }
    }

    @IBAction func newRoundTapped(_ sender: Any) {

        bet = Int(betSliderValue.value)

        userCardArray[0].image = UIImage(named: "\(cardSuit)card\(cardNum)")
        userCardArray[1].image = UIImage(named: "\(cardSuit)card\(cardNum)")

        dealerCardArray[0].image = UIImage(named: "\(cardSuit)card\(cardNum)")
        dealerCardArray[0].image = UIImage(named: "Red_back.jpg")

        //prompt for hit or stand

        if win == true {
            balance += (bet * 2)
        } else {
            balance -= bet
        }

    }


}

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:-1)

通常无法使用init之外的一个属性来初始化另一个属性,因为这样做时:

var b = a + 1

编译器隐式执行:

var b = self.a + 1

但是self尚不可用;仅在init期间可用。

唯一的例外是lazy属性初始化程序:

lazy var b: Int = self.a + 1

根据您的情况,您可以将初始化移至init

var userCardArray: [UIImageView]

init() {
   self.userCardArray = [userCard1, userCard2, ... ]
}