Swift等价于_属性((objc_需要_super))?

Swift等价于_属性((objc_需要_super))?,swift,Swift,是否有一个Swift等价于 __attribute((objc_requires_super)) 如果一个方法不调用它的超级方法,它会发出警告 基本上,如果被重写的方法没有调用其超级方法,我想发出警告(或者更好的是抛出编译器错误)。不,没有与\u属性((objc\u requires\u super))等价的Swift。 等效特征不包含此类属性 本手册中提及此类功能的部分仅说明: 当为子类提供方法、属性或下标重写时,将现有超类实现用作重写的一部分有时很有用 请注意,可以使用final阻止重写

是否有一个Swift等价于

__attribute((objc_requires_super))
如果一个方法不调用它的超级方法,它会发出警告


基本上,如果被重写的方法没有调用其超级方法,我想发出警告(或者更好的是抛出编译器错误)。

不,没有与
\u属性((objc\u requires\u super))等价的Swift。

等效特征不包含此类属性

本手册中提及此类功能的部分仅说明:

当为子类提供方法、属性或下标重写时,将现有超类实现用作重写的一部分有时很有用


请注意,可以使用
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
,因为超类的实现是空的

如注释中所述,如果子类是子类,则会出现这种情况


我不认为这种方法在风格上是好的,但它确实是可能的。

作为
FancyStarship
的子类的
MoreFancyStarship
怎么样?其
super.tractorbeamdidable
不再为空method@BryanChen是的,无论是从冗长程度还是从你提到的原因来看,这肯定不是一个完美的替代品。如果您想强制执行它,
AbstractStarship
可能会有一些运行时错误,如果在
enableTractorBeam()
返回之前没有调用它的
tractorBeamDidEnable()
实现。当然,这也是一个不完美的解决方案,因为开发人员在代码运行之前没有迹象表明这是错误的,这与
objc\u requires\u super
不同。在OpenRadar上发现了这一点: