我是swift的新手,我正在努力学习 创造一个简单的纸牌游戏。我从视频中输入了完全相同的代码。 但xcode显示错误"使用' self'在财产访问&纹理'在super.init初始化自我之前#34; 谢谢你的帮助!
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
}
}
答案 0 :(得分:4)
使用setTexture:
是对超级类SKSpriteNode的texture
(Obj-C中的super.init
)的设置者的调用。
如果要访问超类属性,则必须在 调用super.init
之后执行 。
在这种情况下,我认为你根本不需要修改超类属性,因为纹理被传递给let texture = faceUp ? textureUp : textureDown
super.init(texture: texture, ...
。您可以使用局部变量:
let
我强烈建议您使用var
而不是init
来处理大部分属性。它们不需要在let
之后更改,并且使用{{1}}告诉Swift他们无法更改更安全。