我正在翻阅有关初始化程序和展开的 Swift 文档,但我无法理解有关其工作方式的一些基本知识。
目标:我想子类化SKShapeNode
并使用let reverse : Bool
来定义一个实例变量,该变量只在构造函数中设置并且永远不需要修改。这似乎是定义此类变量的正确方法,但这在下面的代码中会爆炸。
以下代码有效,即它可以编译,不会崩溃并获得我想要的行为。
public class BeamedNotesNode: SKShapeNode {
var notes : [Note]!
var noteNodes : [NoteNode]?
var beam : BeamNode?
var childBeams : [BeamNode]?
var reverse : Bool?
convenience public init(
withTicks notes: [Note],
reverse: Bool = false)
{
self.init(rect: CGRect(x: 0, y: 0, width: 1, height: 1))
self.notes = notes
self.reverse = reverse
...
但是,当我将其修改为 use 时let reverse : Bool
,出现错误:Class 'BeamedNotesNode' has no initializers
在编译时:
public class BeamedNotesNode: SKShapeNode {
var notes : [Note]!
var noteNodes : [NoteNode]?
var beam : BeamNode?
var childBeams : [BeamNode]?
let reverse : Bool
convenience public init(
withTicks notes: [Note],
reverse: Bool = false)
{
self.init(rect: CGRect(x: 0, y: 0, width: 1, height: 1))
self.notes = notes
self.reverse = reverse
...
看来我应该能够使用let
并避免丑陋的强制解包实例变量。我如何在这里实现这一目标?