gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:34:21 24 4
gpt4 key购买 nike

我正在尝试扩展我的 SKScene Swift 类以使用加载的图集中的纹理创建一个 SpriteKit 节点 并同时设置节点的名称以节省我我需要为每个其他节点使用的行,我将它用作扩展,因为我不想在我创建的每个类中都编写相同的方法。此外,我必须将方法创建为类方法,否则我会在初始化时遇到相同的错误。

这是我的扩展代码:

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")

最佳答案

初始化程序需要在调用 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")

关于ios - 如何在初始化器中使用 Swift 扩展函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26738545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com