为什么需要在 public 访问控制 viewController 中覆盖 viewDidLoad 之前设置 public

Why need to set public before override viewDidLoad in a public access control viewController

为什么在 public 访问控制 viewController

中覆盖 viewDidload 之前需要设置 public
public class customViewController: UIViewController {
    override public func viewDidLoad() {
        super.viewDidLoad()
    }
}

如果我删除public,Xcode会给出错误警告!

取自here

Public 访问使实体可以在来自其定义模块的任何源文件中使用,也可以在来自导入定义模块的另一个模块的源文件中使用。在为框架指定 public 接口时,通常使用 public 访问权限。

Internal 访问使实体可以在其定义模块的任何源文件中使用,但不能在该模块外的任何源文件中使用。在定义应用程序或框架的内部结构时,您通常会使用内部访问。

Private 访问限制实体对封闭声明的使用。使用私有访问隐藏特定功能的实现细节。

File-private 访问权限将实体的使用限制在其自己的定义源文件中。

您需要 public 修饰符吗?你可以这样写:

class customViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

没有警告

错误信息相当明确:

Overriding instance method must be as accessible as the declaration it overrides.

这意味着方法的访问级别不得低于其覆盖的方法。

例如给出这个 class:

public class Superclass {
    internal func doSomething() {
        ...
    }
}

您无法使用比 interal 更难访问的方法覆盖 doSomething。例如

public class Subclass : Superclass {
    // error
    private override func doSomething() {
    }
}

然而,您可以重写一个方法并使其 更多 可访问:

public class Subclass : Superclass {
    public override func doSomething() {
        // You can even call the internal method in the superclass
        super.doSomething()
    }
}

reference documentation对此有很多细节,但似乎将这种关系留给了暗示。

您class声明是:

public class customViewController: UIViewController

这会打开 customViewController 最多 public 的访问权限(公开继承)

写这个会给你错误:

override func viewDidLoad() {
    super.viewDidLoad()
}

这里发生的是方法的默认访问级别继承如何处理访问级别之间的不愉快交互。

A subclass must preserve the accessibility of its superclass’s methods wherever the subclass might be used directly. Otherwise, we would violate the substitution principle that allows us to treat all kinds of UIViewController as just another UIViewController.