【问题标题】:Why need to set public before override viewDidLoad in a public access control viewController为什么需要在公共访问控制视图控制器中覆盖 viewDidLoad 之前设置公共
【发布时间】:2016-01-13 15:10:34
【问题描述】:

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

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

如果我删除公众号,Xcode 会给出错误警告!

【问题讨论】:

    标签: ios swift public


    【解决方案1】:

    取自here

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

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

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

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

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

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

    没有警告

    【讨论】:

    • 给出的示例代码实际上创建了一个internal customViewController 类,因为这是在未指定任何访问级别时的默认访问级别。
    • 谢谢!我了解访问控制级别之间的区别。我真的很困惑为什么我添加 public 给我一个错误。我认为覆盖访问控制级别不能低于类级别和方法级别之间的最低级别。
    • 在 Swift 3 中,私有访问将实体的使用限制在封闭声明中,而 fileprivate 限制对源文件的使用。
    【解决方案2】:

    错误信息相当明确:

    重写实例方法必须与它的声明一样可访问 覆盖。

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

    例如给定这个类:

    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 对此有很多细节,但似乎隐含了这种关系。

    【讨论】:

    • 我认为覆盖访问控制级别不能低于类级别和方法级别之间的最低级别。
    【解决方案3】:

    你的类声明是:

    public class customViewController: UIViewController

    这会打开customViewControllerpublic 的访问权限(公开继承)

    这样写会给你错误:

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

    这里发生的情况是,方法的默认访问级别继承处理访问级别的方式之间发生了不愉快的交互。

    子类必须保留其超类方法的可访问性 可以直接使用子类的任何地方。否则,我们会 违反允许我们对待所有种类的替代原则 UIViewController 只是另一个 UIViewController

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 2016-01-18
      • 2012-02-17
      • 2011-09-16
      • 1970-01-01
      相关资源
      最近更新 更多