Swift的访问控制讲解

本人已迁移博客至掘进,以后会在掘进平台更新最新的文章也会有更多的干货,欢迎大家关注!!!https://juejin.im/user/588993965333309

 

 

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之后的访问修饰符的,希望对大家有所帮助

 

posted @ 2019-07-01 16:53  国孩  阅读(1149)  评论(0编辑  收藏  举报