2015-10-15 60 views
4

为什么需要在一个公共接入控制的viewController覆盖viewDidLoad中之前设置公共重写viewDidLoad中之前设置公共为什么需要在一个公共接入控制的viewController

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

如果我删除了市民,Xcode中会给出错误警告!

回答

6

的错误信息是非常明确的:

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

这意味着方法不能比的方法,其较低的访问级别覆盖。

例如给出这个类:

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

不能然后覆盖doSomething与比interal较少访问的方法。例如

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

我认为覆盖访问控制级别不能低于类级别和方法级别之间的最低级别。 – Dennis

1

here从注意到

Public访问使得能够从他们的定义模块任何源文件中使用的实体,并且还从该导入定义模块另一模块中的源文件。在为框架指定公共接口时,通常使用公共接口。

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

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

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

你需要公共修饰符吗?你可以写这样的:

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

没有警告

+0

给出的示例代码实际上创建了一个内部的customViewController类,因为这是没有指定时的默认访问级别。 –

+0

谢谢!我了解访问控制级别之间的区别。我真的很困惑,为什么我加上公开给我一个错误。我认为覆盖访问控制级别不能低于该级别和方法级别之间的最低级别。 – Dennis

+0

在Swift 3中,私有访问限制了实体对封闭声明的使用,而fileprivate限制了对源文件的使用。 – nbloqs

0

你类声明:

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 .

相关问题