为什么需要在公共访问控制viewController
中覆盖viewDidload之前设置publicpublic class customViewController: UIViewController {
override public func viewDidLoad() {
super.viewDidLoad()
}
}
如果删除公众,Xcode会发出错误警告!
答案 0 :(得分:9)
错误消息非常明确:
重写实例方法必须与声明一样可访问 覆盖。
这意味着方法的访问级别不得低于覆盖的方法。
例如给出这个类:
public class Superclass {
internal func doSomething() {
...
}
}
您无法使用比doSomething
更难访问的方法覆盖interal
。 e.g。
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有很多细节,但似乎将这种关系留给了暗示。
答案 1 :(得分:1)
从here
开始 Public
访问允许实体在其定义模块的任何源文件中使用,也可以在另一个导入定义模块的模块的源文件中使用。在指定框架的公共接口时,通常使用公共访问。
Internal
访问允许实体在其定义模块的任何源文件中使用,但不能在该模块之外的任何源文件中使用。在定义应用程序或框架的内部结构时,通常使用内部访问。
Private
访问权限将实体的使用限制在封闭声明中。使用私有访问隐藏特定功能的实现细节。
File-private
访问权限将实体的使用限制在其自己的定义源文件中。
你需要公共修饰符吗?你可以这样写:
class customViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
没有警告
答案 2 :(得分:0)
你的课程声明是:
public class customViewController: UIViewController
这将打开customViewController
最多public
访问权限(公开继承)
写这个会给你错误:
override func viewDidLoad() {
super.viewDidLoad()
}
这里发生的事情是方法的默认访问级别与继承处理访问级别的方式之间的令人不快的交互。
子类必须保留其超类的方法的可访问性 子类可以直接使用的地方。否则,我们会的 违反允许我们对待各种类型的替代原则
UIViewController
只是另一个UIViewController
。