【问题标题】:An error occurs :Cannot use instance member 'card0' within property initializer; property initializers run before 'self' is available [duplicate]发生错误:不能在属性初始化程序中使用实例成员“card0”;属性初始化程序在“self”可用之前运行[重复]
【发布时间】:2021-04-03 17:30:15
【问题描述】:

我遇到以下错误: 不能在属性初始化器中使用实例成员“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 )
}

【问题讨论】:

标签: ios swift iphone xcode


【解决方案1】:

您需要将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.
    }
}

当属性的初始值依赖于外部因素时,惰性属性非常有用,而外部因素的值在实例初始化完成后才知道。

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

【讨论】:

  • 很高兴听到这个消息,希望您能接受答案!
猜你喜欢
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2021-03-19
  • 2020-10-24
  • 1970-01-01
  • 2017-09-18
相关资源
最近更新 更多