【问题标题】:Error: Use of 'self' in property access 'texture' before super.init initializes self错误:在 super.init 初始化 self 之前,在属性访问“纹理”中使用“自我”
【发布时间】:2015-08-16 05:11:42
【问题描述】:

我是 swift 新手,我正在尝试通过以下方式学习 swift 创建一个简单的纸牌游戏。我从视频中输入了完全相同的代码。 但是xcode显示错误“在super.init初始化self之前在属性访问'texture'中使用'self'” 感谢您的帮助!

import SpriteKit

class Card: SKSpriteNode {
    var rank: Int
    var suit: String
    var imageNameUp: String
    var textureUp: SKTexture
    var textureDown: SKTexture

init(rank: Int, suit: String, faceUp: Bool){

    self.rank = rank
    self.suit = suit
    self.imageNameUp = "\(suit)_\(rank)"
    self.textureUp = SKTexture(imageNamed: imageNameUp)
    self.textureDown = SKTexture(imageNamed: "cardback")



    if faceUp {
      self.texture = textureUp  //error 
    } else {
      self.texture = textureDown  //error
    }

    super.init(texture: texture, color: nil, size: texture!.size())  //error causes when I try to unwrap size: texture!.size()

}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func flip(){
    self.texture = textureUp
}

}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    self.texture = ... 的使用是对超类 SKSpriteNode 的 texture 设置器的调用(Obj-C 中的setTexture:)。

    如果您想访问超类属性,您必须在调用super.init之后这样做。

    在这种情况下,我认为您根本不需要修改超类属性,因为纹理正在传递给super.init。您可以使用局部变量:

    let texture = faceUp ? textureUp : textureDown
    super.init(texture: texture, ...
    

    我还强烈建议您对大多数属性使用let 而不是var。在init 之后它们不需要更改,使用let 告诉 Swift 他们不能更改会更安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2015-02-02
      • 2015-01-17
      相关资源
      最近更新 更多