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

Posted

技术标签:

【中文标题】Swift - 必须调用超类 SKSpriteNode 错误的指定初始化程序【英文标题】:Swift - Must call a designated initializer of the superclass SKSpriteNode error 【发布时间】:2014-09-29 14:53:24 【问题描述】:

此代码在第一个 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)

我被它困住了.. 最简单的解决方法是什么?

【问题讨论】:

【参考方案1】:

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)
    

此外,我会将所有这些合并到一个初始化程序中。

【讨论】:

我设法以最方便的方式解决了这个问题init - ***.com/a/25164687/2117550 @grfs:非常有帮助的答案,但我很好奇:它在哪里记录了这是 SKSpriteNode 的唯一指定初始化程序? @drewblaisdell developer.apple.com/library/prerelease/ios/documentation/…: @drewblaisdell 如果您查看初始化程序是如何声明的,您会看到便利初始化程序标有便利关键字,而指定初始化程序则没有。这不是很清楚,因为您需要单击每个初始化程序并查看它的声明方式。希望他们在未来开发出更好的展示方式。 我希望我能投票两次,因为这个答案只是让便利初始化程序和超级初始化程序之间的相关性为我点击。谢谢@Epic Byte【参考方案2】:

疯狂的东西..我不完全明白我是如何解决它的..但这很有效:

convenience init() 
    self.init(imageNamed:"bubble")
    self.hidden = true


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

convenience 添加到init 并删除init(texture: SKTexture!)

【讨论】:

以上是关于Swift - 必须调用超类 SKSpriteNode 错误的指定初始化程序的主要内容,如果未能解决你的问题,请参考以下文章

从 Objc 超类继承的 Swift 子类中未调用 viewDidLoad

super.init() 无法在 swift3 中调用

必须调用超类“UICollectionView”的指定初始化程序

Swift - 在超类的覆盖函数中返回子类类型

`attemptRecovery(fromError:optionIndex:)` 在 NSDocument 的 Swift 子类的超类中找不到

swift 学习- 14 -- 继承