如何在初始化器中使用Swift扩展函数?

时间:2014-11-04 15:10:40

标签: ios swift sprite-kit

我正在尝试扩展我的 SKScene Swift类,使用加载的地图集中的纹理创建 SpriteKit节点并同时设置节点的名称,以节省我的时间我需要为每个其他节点使用的行,并且我将它用作扩展,因为我不想在我创建的每个类中编写相同的方法。另外,我必须将方法创建为类方法,否则我会在init处获得相同的错误。

这是我的扩展程序代码:

import SpriteKit

internal extension SKScene {

func nodeWithTexture(atlas: SKTextureAtlas, texture: String, name: String) -> SKSpriteNode {
    let nodeTexture = atlas.textureNamed(texture)
    let node = SKSpriteNode(texture: nodeTexture)
    node.name = name
    return node
  }
}

现在,我的问题是我无法在我的场景的启动器中使用该方法。它给了我一个我不理解的super.init错误。

这是我在super.init(size: size)调用之前尝试在init中使用扩展程序时遇到的错误。

enter image description here

这是我在super.init(size)调用后尝试使用时出现的错误。

enter image description here

问题更新

由于Nate的回答,我使用下一种方法解决了我的问题。

首先,我在声明时刻初始化所有存储的属性:

let background = SKSpriteNode()

然后我在super.init(size: size)调用后调用扩展方法,并设置了所有内容:

super.init(size: size)
background = nodeWithTexture(atlas, texture: "bg", name: "background")

1 个答案:

答案 0 :(得分:4)

初始化程序需要在调用super.init()之前为所有存储的属性提供初始值,并且必须先调用super.init()才能调用任何其他实例方法。

您可以通过以下两种方式解决此问题:

  1. background声明为隐式解包的可选项 - nil是可选项的可接受初始值,因此您可以在nodeWithTexture()后调用super.init()

    var background: SKSpriteNode!
    
  2. 将背景声明为懒惰属性 - 如果它始终基于atlas,您可以这样声明:

    lazy var background: SKSpriteNode = self.nodeWithTexture(self.atlas, texture: "bg", name: "background")