Swift等价于__attribute((objc_requires_super))?

时间:2014-11-30 06:21:20

标签: swift

是否存在等同于

的Swift
__attribute((objc_requires_super))

如果方法没有调用它的超级方法,它会发出警告吗?

基本上,如果被覆盖的方法没有调用它的超级方法,我想警告(或者甚至更好地抛出编译器错误)。

1 个答案:

答案 0 :(得分:11)

不,没有Swift等同于__attribute((objc_requires_super))

等效功能Swift Attributes不包含此类属性。

Swift inheritance documentation中提及此类功能 的部分仅表示:

  

当您为子类提供方法,属性或下标覆盖时,有时将现有的超类实现用作覆盖的一部分。


请注意,可以阻止使用final覆盖函数,因此您可以有效地通过提供由非调用的空的可覆盖方法来实现您想要的功能可覆盖的方法:

class AbstractStarship {
    var tractorBeamOn = false

    final func enableTractorBeam() {
        tractorBeamOn = true

        println("tractor beam successfully enabled")

        tractorBeamDidEnable()
    }

    func tractorBeamDidEnable() {
        // Empty default implementation
    }
}

class FancyStarship : AbstractStarship {
    var enableDiscoBall = false

    override func tractorBeamDidEnable() {
        super.tractorBeamDidEnable() // this line is irrelevant

        enableDiscoBall = true
    }
}

子类将覆盖可覆盖的方法,因为超类的实现是空的,所以它们是否调用super并不重要。

如注释中的Bryan Chen注释,如果子类是子类,则会发生这种情况。

我没有声称这种方法是否风格上好,但它肯定是可能的。