Swift 中 super 关键字的作用是什么?

推荐答案

在 Swift 中,super 关键字用于在子类中调用父类的属性、方法或下标。它通常用于重写父类的方法或属性时,保留父类的实现,并在其基础上添加子类的特定行为。

本题详细解读

1. super 的基本用法

super 关键字主要用于以下场景:

  • 调用父类的初始化方法:在子类的初始化方法中,可以使用 super.init() 来调用父类的指定初始化方法。

    -- -------------------- ---- -------
    ----- ------ -
        --- ----- ------
        ---------- ------- -
            --------- - ----
        -
    -
    
    ----- ------ ------ -
        --- ---- ---
        ---------- ------- ---- ---- -
            -------- - ---
            ---------------- -----
        -
    -
    展开代码
  • 调用父类的方法:在子类中重写父类的方法时,可以使用 super.methodName() 来调用父类的实现。

    -- -------------------- ---- -------
    ----- ------ -
        ---- ------- -
            ------------ ---- --------
        -
    -
    
    ----- ------ ------ -
        -------- ---- ------- -
            -------------  -- ----- ----- --
            ------------ ---- -------
        -
    -
    展开代码
  • 访问父类的属性:在子类中重写父类的属性时,可以使用 super.propertyName 来访问父类的属性。

    -- -------------------- ---- -------
    ----- ------ -
        --- ------------ ------ -
            ------ --------
        -
    -
    
    ----- ------ ------ -
        -------- --- ------------ ------ -
            ------ ----------------- - - --- ------
        -
    -
    展开代码

2. super 的使用场景

  • 方法重写:当子类需要扩展或修改父类的方法时,通常会先调用 super.methodName() 来执行父类的逻辑,然后再添加子类的特定逻辑。

  • 初始化链:在子类的初始化方法中,必须确保父类的初始化方法被调用,以确保父类的属性被正确初始化。

  • 属性重写:在子类中重写父类的计算属性或观察属性时,可以使用 super.propertyName 来访问父类的属性值。

3. 注意事项

  • 初始化顺序:在子类的初始化方法中,必须先初始化子类的所有存储属性,然后才能调用 super.init()

  • 避免循环调用:在使用 super 时,要确保不会导致无限递归调用,尤其是在重写方法时。

  • 访问控制super 只能访问父类中具有适当访问控制级别的成员(如 publicinternalopen)。

纠错
反馈

纠错反馈