我正在快速制作一个小游戏,并希望让我的玩家在屏幕上的3个固定点上移动。 我创建了一个数组来存储我在init函数中计算的值,但编译器并不同意我在super.init()之前没有声明数组。这就是我所拥有的
//properties
var player:SKSpriteNode = SKSpriteNode()
var playerPos = 1
var legalPositions: [CGFloat]
override init(size:CGSize)
{
super.init(size: size)
legalPositions[0] = self.frame.width/4
legalPositions[0] = self.frame.width/2
legalPositions[0] = self.frame.width/0.5
}
当我尝试构建它时,我收到错误
GameScene.swift:31:9:Property' self.legalPositions'没有在super.init调用
初始化有没有办法在调用init函数之前初始化属性?
答案 0 :(得分:0)
是的,您可以使用在初始化程序中覆盖的虚拟值:
var legalPositions: [CGFloat] = [0]
这样,在调用基类初始值设定项之前初始化legalPositions
数组。 Swift的两阶段初始化需要此过程,以便能够保证在创建类的新实例后初始化所有属性。
这种方法的好处是不需要隐式解包的选项。它们开辟了设置nil
值的可能性,这不是你想要的。
请注意,您的代码段中的前两个分配是不必要的,因为第三个分配将覆盖legalPositions
数组的第一个项目的值。
答案 1 :(得分:0)
这实际上是Implicitly Unwrapped Optionals的一个很好的用例。基本上,您将legalPositions
定义为[CGFloat]!
,将其默认为nil
。然后,您可以在<{1}}之后设置。
由于它是隐式展开的,因此您不必担心每次使用时都可以使用可选绑定或强制解包来展开它。而且,由于您始终使用super.init(size: size)
方法进行设置,因此您不必担心它会init
并导致崩溃。
nil