zoukankan      html  css  js  c++  java
  • Swift的访问控制讲解

    Swift中访问修饰符总共有5种,分别为fileprivate,private,internal,public和open,其中,fileprivate以及open是Swift 3新添加的.因为过去的Swift对于访问权限的控制,不是基于类的,而是基于文件的,这样会有问题,所以在Swift 3中增加了两个对原本的private,public进行细分.

    1.private与fileprivate

    fileprivate是在Swift 3之后添加的,将原本的private进行细分

    在引入Swift 3之前,private关键字将实体的使用限制在定义它的源文件中.如下:

    import UIKit
    
    class NotesViewController: UIViewController {
        private var dataSource = [String]()
    }
    
    extension NotesViewController: UITableViewDataSource {
    
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return dataSource.count
        }
        ...
    }

    我们声明一个UIViewController子类NoteViewController,子类并带有私有属性dataSource.在同个源文件中,我们为NotesViewController类创建一个扩展,遵守UITableViewDataSource协议,也可访问到私有属性private修饰的.

    上面的代码是Swift3之前,如果将上述代码移植到Swift 3,编译器会报错,会提示dataSource属性是一个未解析的标识符.换句话说,dataSource属性声明为private,扩展名中是不可以访问的.

    Swift 3以后,private为私有的实体只能在声明的范围内被访问.而fileprivate可以在拓展文件中访问.

    import UIKit
    
    class NotesViewController: UIViewController {
        fileprivate var dataSource = [String]()
    }
    
    extension NotesViewController: UITableViewDataSource {
    
        func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return dataSource.count
        }
        ...
    }

    2.internal修饰符

    internal访问权限在模块内部可以访问到,超出模块内部就不可被访问了,Swift中默认就是internal的访问权限.

    3.public与open

    Swift 3之前 public可以用来修饰class或者class成员方法,成员属性等.Swift 3新增了open访问控制关键字.

    修饰class的public和open区别:

    public修饰的class允许外部模块调用,但是不允许继承,而open修饰的class即允许其他模块调用,也允许被子类继承

    修复class成员的public和open区别:

    public修饰的成员允许其他模块调用,但不能被覆盖(override),而open修饰的成员既允许被其他模块调用,也可以被子类覆盖

    open使用注意:


    1.如果class声明为public,那么class的成员变量就不可以声明为open,因为public class已被限定为不可继承

    public class NonSubclassableParentClass {
            public func foo() {}
            //非法声明
            open func bar() {}
            public final func baz() {}
        }

    2.其他模块继承父类的成员时,也需要把成员声明为open

    open class SubclassableParentClass {
            public func foo() {}
            open func bar() {}
            public final func baz() {}
        }
    
        open class SubclassC : SubclassableParentClass {
            //非法,成员没有被声明为open
            override func bar() { } 
        }

    以上就是Swift 3之后的访问修饰符的,希望对大家有所帮助

  • 相关阅读:
    编程谜题:提升你解决问题的训练场
    同态加密实现数据隐私计算,能让你的小秘密更加秘密
    interviewstreet pair
    x & (x 1)==0
    uva 11991 Easy Problem from Rujia Liu?
    hdoj 1230 火星A+B
    hdoj 1711 KMP Number Sequence
    HackerRank网站,为编码程序员们提供一个以编码谜题和现实生活中遇到的编码难题为基础的新兴的社交平台
    ACM博弈知识汇总
    hdoj 1202 水水更健康
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/11114722.html
Copyright © 2011-2022 走看看