【问题标题】:Error: "Property 'self.gameArea' not initialised at super.init call"错误:“在 super.init 调用时未初始化属性‘self.gameArea’”
【发布时间】:2016-11-05 10:18:20
【问题描述】:

我收到标题中写的错误。我对这一切都很陌生。任何帮助表示赞赏。

这是 GameScene.swift 文件:

class GameScene: SKScene {

let player = SKSpriteNode(imageNamed: "shuttle")

let bulletSound = SKAction.playSoundFileNamed("torpedo.mp3", waitForCompletion: false)

let gameArea: CGRect

override init(size: CGSize) {

    let maxRatio: CGFloat = 16.0/9.0
    let playableWidth = size.height / maxRatio
    let margin = (size.width - playableWidth) / 2

    gameArea = CGRect(x: margin - size.width / 2, y: size.height / 2, width: playableWidth, height: size.height)

    super.init(size: size)

}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

【问题讨论】:

    标签: sprite-kit swift3 init


    【解决方案1】:

    我建议您阅读initialization process。 Swift 执行两步初始化。第一阶段是初始化所有存储的属性。 Swift 编译器也会执行一些安全检查,以确保正确执行两阶段初始化。这是来自文档:

    安全检查 1

    指定的初始化器必须确保其类引入的所有属性在它委托给 超类初始化器。

    所以你可以在初始化器中初始化你的属性:

    required init?(coder aDecoder: NSCoder) {
            self.gameArea = CGRect()
            super.init(coder: aDecoder)
        }
    

    或在属性声明处(并可选择将其声明为 var):

    var gameArea = CGRect()
    

    如果您不将其设为 var,则在初始化后(在声明时)您将无法在以后更改它。当您在初始化程序中初始化属性时也是如此。如果它是一个 let 常量,则无法进行进一步的修改。

    【讨论】:

    • 虽然我认为您已经回答了问题所在的问题,但这是一个比我聪明得多的人可以帮助大量未来 Swift 用户,尤其是 Sprite Kit Swift 用户的领域。了解这种设计结构及其过程的含义为如何构建和塑造 Sprite Kit 游戏、对象、属性及其关系提供了智慧和洞察力。这我只看到了最微不足道的一瞥。但这种洞察力和智慧对于思考如何在 Swift 和 Sprite Kit 中构建和做任何事情是非常宝贵的。
    • @Confused OPs 错误与未初始化的存储属性有关。我刚刚指出他出了什么问题。如果他想更深入地了解,他应该多读几遍初始化过程。这里没有与游戏或 SpriteKit 相关的内容。总的来说是斯威夫特。简单的问题,简单的答案 :) 如果他对深度感兴趣,他应该阅读文档以熟悉一切是如何工作的。
    • 我不是在谈论 OP,也不是在谈论 Swift 本身的本质,而是更多关于 GameScene 和 didMove(to view...) 等在思考如何计划并制作一个游戏世界,从概念到现实,它的角色和点点滴滴都聚集在一起。我已经阅读了很多次初始化的东西,但仍然被它所吸引,因为 Sprite Kit 完全基于第一个游戏场景,以及如何使用它来做事。也许军团就是我;)
    • @Confused 我明白了。但这不是一个问题。如果是这样,我可能会尝试回答这个问题。感谢您的支持;)
    • 我意识到 SO 不适合这样做,但我曾希望 SO.docs 能够成为类似于智慧和洞察力的宝库,因为 Apple 放弃为学习者提供任何有意义的示例和那些穿越的人。一般来说,程序员似乎并不热衷于试图解释事物,只是为了展示事物。部分问题可能是骄傲。尽管编程的文献、文档和缺乏共同的智慧和洞察力,但程序员似乎紧紧抓住他们共同的自豪感(当之无愧),因为他们已经弄清楚了事情。 SO就是证明;)
    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 2014-10-09
    • 2014-07-24
    相关资源
    最近更新 更多