当前位置: 首页 > 面试题库 >

Swift-必须调用超类SKSpriteNode错误的指定初始化器

邵星河
2023-03-14
问题内容

这段代码适用于第一个XCode 6 Beta,但在最新的Beta中,它不起作用,并显示以下错误 Must call a designated initializer of the superclass SKSpriteNode

import SpriteKit

class Creature: SKSpriteNode {
  var isAlive:Bool = false {
    didSet {
        self.hidden = !isAlive
    }
  }
  var livingNeighbours:Int = 0

  init() {
    // throws: must call a designated initializer of the superclass SKSpriteNode
    super.init(imageNamed:"bubble") 
    self.hidden = true
  }

  init(texture: SKTexture!) {
    // throws: must call a designated initializer of the superclass SKSpriteNode
    super.init(texture: texture)
  }

  init(texture: SKTexture!, color: UIColor!, size: CGSize) {
    super.init(texture: texture, color: color, size: size)
  }
}

这就是此类的初始化方式:

let creature = Creature()
creature.anchorPoint = CGPoint(x: 0, y: 0)
creature.position = CGPoint(x: Int(posX), y: Int(posY))
self.addChild(creature)

我坚持下去..最简单的解决方法是什么?


问题答案:

init(texture: SKTexture!, color: UIColor!, size: CGSize)是SKSpriteNode类中唯一指定的初始值设定项,其余都是方便的初始值设定项,因此您不能在它们上调用super。将代码更改为此:

class Creature: SKSpriteNode {
    var isAlive:Bool = false {
        didSet {
            self.hidden = !isAlive
        }
    }
    var livingNeighbours:Int = 0

    init() {
        // super.init(imageNamed:"bubble") You can't do this because you are not calling a designated initializer.
        let texture = SKTexture(imageNamed: "bubble")
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
        self.hidden = true
    }

    init(texture: SKTexture!) {
        //super.init(texture: texture) You can't do this because you are not calling a designated initializer.
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
    }

    init(texture: SKTexture!, color: UIColor!, size: CGSize) {
        super.init(texture: texture, color: color, size: size)
    }
}

此外,我会将所有这些整合到一个初始化器中。



 类似资料:
  • 问题内容: 我正在使用核心数据在vc1中保存类别,并希望将列表属性添加到vc2中的列表中。我的数据模型是许多列表属性的一类。 我在vc1中添加了这样的类别: 在vc2中设置数据: 它在最后一行崩溃:说: 如果放置断点并打印数组,则托管对象在数组中。怎么了? 问题答案: 专用的初始化程序是 显然,您不是要插入新对象,因此确实需要一个可选值。也许您将类变量声明为?尝试将其设置为,也将运算符更改为。

  • 问题内容: 我有两节课,和 通过上面的实现,我得到了错误: 为什么在致电之前必须先设置? 问题答案: 引用Swift编程语言,它回答了您的问题: “ Swift的编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误:” 安全检查1“指定的初始值设定项必须确保由其类引入的所有属性在将其委托给超类初始值设定项之前都已初始化。” 摘录自:苹果公司“ The Swift Programming

  • 我的玻璃鱼在我尝试跑步时抛出一个异常。 [2018-02-22T17:07:04.135 0100][glassfish 5.0][Severy][javax.enterprise.system.core][tid:_ThreadID=46 _ThreadName=admin listener(4)][timeMillis:1519315624135][levelValue:1000][加载应用时

  • 问题内容: 我正在尝试从youtube教程创建类似Facebook Messenger的应用程序。我有一个主页,用户单击BarButton打开聊天室。主页工作正常,直到我单击BarButton打开聊天,它会崩溃并显示以下错误消息“ UICollectionView必须使用非nil布局参数初始化”。我是iOS开发的新手,因此无法真正理解问题所在,因为我已经有了init方法。由于我有不同的看法,我是否

  • 问题内容: 我试图了解Swift类中关键字的使用。 不会强迫我在子类中实现该方法。如果我要重写指定初始化我的父类的我需要写和不。我知道它是如何工作的,但不明白为什么我应该这样做。 有什么好处?据我所知,像C#这样的语言没有这样的东西,并且可以很好地工作。 问题答案: 实际上,这只是使编译器满意的一种方法,可以确保该类如果具有任何子类,它们将继承或实现相同的初始化程序。在这一点上存在疑问,因为这样的

  • 我找不到任何关于这个具体案例的具体SO帖子,所以我想问一下我认为是/否的问题。 以下是JLS§12.4.2(Java SE 8),清单6-7: 我的问题是:这是否意味着子类的final static变量在超类的静态初始化之前初始化(假设final static作为其声明的一部分初始化)?