发生错误:无法在 属性 初始化程序中使用实例成员 'card0'; 属性 初始值设定项 运行 在 'self' 可用之前

An error occurs :Cannot use instance member 'card0' within property initializer; property initializers run before 'self' is available

我遇到以下错误: 不能在 属性 初始值设定项中使用实例成员 'card0'; 属性 初始值设定项 运行 在 'self' 可用之前

我是大一新生,非常感谢您的建议和提示:)

代码: 视图控制器:

import UIKit

class ViewController: UIViewController {

    let card0: Card = startingcard()
    var pl1: Card = firstplayercard(card0: card0)
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

struct Card {
    var signs: [Int]
    var restSymbols: [Int]
    var matching: Int
}

func startingcard() -> Card {
    let randomChoice = GKRandomDistribution(lowestValue: 0, highestValue: 15)
    var symbols = [Int]()
    for index in 0...15{
        symbols.append(index)
    }
    var card = [Int]()
    var i = 5
    while i >= 0 {
        let a = randomChoice.nextInt()
        let n = symbols[a]
        if n > 0 {
            card.append(n)
            symbols[a] = 0
        }else{
            i += 1
        }
        i -= 1
    }
    print(symbols)
    print(card)
    return Card(signs: card, restSymbols: symbols, matching: 0)
}

func firstplayercard(card0: Card) -> Card{

    let randomChoice = GKRandomDistribution(lowestValue: 0, highestValue: 15)
    let secondRandom = GKRandomDistribution(lowestValue: 0, highestValue: 5)
    var symbols = card0.restSymbols
    
    var playerCard = [Int]()
    var i = 5
    while( i >= 0) {
        let a = randomChoice.nextInt()
        let n = symbols[a]
        if( n != 0){
            playerCard.append(n)
            symbols[a] = 0
        }else{
            i += 1
        }
        i -= 1
    }
    let k = secondRandom.nextInt()
    let l = secondRandom.nextInt()
    playerCard[k] = card0.signs[l]
    //return k to symbols, because it's unused
    symbols[k] = k
    print("Player card:\n")
    print(playerCard)
    print(symbols)
    print(l)
    
    return Card(signs: playerCard, restSymbols: symbols, matching: l )
}

您需要将 pl1 存储 属性 转换为 延迟存储 属性:

class ViewController: UIViewController {

    let card0: Card = startingcard()
    lazy var pl1: Card = firstplayercard(card0: card0)
   
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

Lazy properties are useful when the initial value for a property is dependent on outside factors whose values are not known until after an instance’s initialization is complete.

您可以在“惰性存储属性”一章下的 official documentation 中阅读有关惰性属性的更多信息。