在Swift中没有参数的便利init?

时间:2018-10-19 20:35:16

标签: ios iphone swift

我正在尝试制作这样的课程:

class Brick2 : SKShapeNode {

   override convenience init() {

       self.init(rectOf: CGSize(width: UIScreen.main.bounds.width/5, height: UIScreen.main.bounds.width/5), cornerRadius: UIScreen.main.bounds.width/20)

}

代码可以编译,但是当我在模拟器中启动应用程序时,它会崩溃。

问题是在另一个类中它起作用:

class Sidebar : SKShapeNode {

    convenience init(rectOf: CGSize, cornerRadius: CGFloat, y: CGFloat) {

         self.init(rectOf: rectOf, cornerRadius: cornerRadius)        
         self.position = CGPoint(x: UIScreen.main.bounds.width, y : y)
    }
}

如果我不使用带有参数的init覆盖它,它会起作用,但不会覆盖它。

我想在不传递任何参数的情况下实例化Brick2类,因为所有积木的大小都相同。

编辑:Xcode中的错误是“线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7ffee4f8fff8)”

1 个答案:

答案 0 :(得分:0)

您尝试覆盖的init()似乎不属于 SKShapeNode 或其超类 SKNode 或其超类 UIResponder < / strong>;但这会覆盖根类 NSObject init()

实际上,您不能覆盖指定的初始化器(init()),而不能使用便捷初始化器(init(rect:cornerRadius:))来初始化对象。

为达到您要实现的目标,我建议这样做:

class Brick2: SKShapeNode {

    // Make init() inaccessible to other classes, to prevent the accidental usage of the same,
    // instead of the expected instance() method call.
    private override init() {
        super.init()
    }

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

    class func instance() -> Brick2 {
        return Brick2(rectOf: CGSize(width: UIScreen.main.bounds.width / 5,
                                     height: UIScreen.main.bounds.width / 5),
                      cornerRadius: UIScreen.main.bounds.width / 20)
    }
}

然后,您可以使用以下方法初始化 Brick2 实例:

let brick = Brick2.instance()